我看到了一些解决方案,但我仍无法解决代码中的错误。我的deleteFromStart
方法不会从列表中删除任何元素。 ob.display()
的两次调用都产生相同的输出。你能告诉我我错过了什么,或者错误在哪里吗?
LikedList:
package lab5;
public class LinkedList {
public static void main(String argsp[]){
List ob = new List();
ob.addAtStart("y", 6);
ob.addAtStart("w", 4);
ob.addAtStart("z", 3);
ob.addAtEnd("a",3);
ob.addAtEnd("b",4);
ob.addAtEnd("c",5);
ob.display();
ob.deleteFromStart();
System.out.println("\n");
ob.display();
}
}
列表:
package lab5;
public class List {
Node head;
public List(){
head=null;
}
public List(Node e){
head=e;
}
Node oldfirst=null;
Node lasthead=null;
public void addAtStart(String name, int age){
Node newObject= new Node(name,age);
newObject.next=head;
if (oldfirst==null) {
oldfirst = newObject;
}
head = newObject;
lasthead = head;
}
public void display() {
Node store = head;
while (store != null) {
store.display();
store=store.next;
System.out.println();
}
}
public void addAtEnd(String name, int age){
Node atEndValue = new Node(name, age);
oldfirst.next = atEndValue;
oldfirst = atEndValue;
}
public void deleteFromStart() {
while (lasthead != null) {
lasthead = lasthead.next;
}
}
public boolean isEmpty() {
return head == null;
}
节点
package lab5;
public class Node {
String name;
int age;
Node next;
public Node(){
name="Abc";
age=10;
next=null;
}
public Node(String name, int age ){
this.name=name;
this.age=age;
next = null;
}
public void display(){
System.out.println("Name: " + name + " Age: " + age);
}
}
答案 0 :(得分:3)
tl; dr 要删除链接列表中的第一个元素:
head = head.next
当您实施单链表时,您实际上只需要保留一个指针:head
(即对列表中第一个节点的引用。实际上,它是' s也可用于跟踪列表中的最后一个元素(通常称为tail
)。这允许在列表末尾进行常量操作,如果您经常添加元素,这将非常有用最后,通过这个基本实现,您最终会得到类似的结果:
class LinkedList {
private Node head = null;
private Node tail = null;
public LinkedList() {}
public LinkedList(Node e) {
head = e;
tail = e;
}
}
class Node {
Node next = null;
// other data
}
添加和删除链接列表中的元素可归结为更新head
和tail
变量所指的内容。考虑一个包含三个元素[A, B, C]
的单链表。值head
和tail
值的对齐方式如下:
A -> B -> C -> null
^ ^
| |
head tail
如果要插入新元素X
,则有两个步骤:
1)告诉X.next
引用A
:
X -> A -> B -> C -> null
^ ^
| |
head tail
2)更新head
以引用X
:
X -> A -> B -> C -> null
^ ^
| |
head tail
您以类似的方式移动head
和tail
,具体取决于您是否添加或删除操作,以及操作是否位于列表的开头或结尾。< / p>
从一开始就删除元素(假设列表不为空)就像更新head
以引用下一个元素一样简单。在上面的示例中,这意味着移动head
以引用X.next
,A
:
X -> A -> B -> C -> null
^ ^
| |
head tail
现在请记住,链接列表只能直接了解head
和tail
,因此,一旦您更新head
以引用A
,就没有任何引用{{1}在您的应用程序中的任何地方,它已被有效删除(在Java中,这将导致它被垃圾收集)。
有效地,我们上面所做的只是X
。同样,您必须首先确保列表不是空的,因为如果列表为空,head = head.next
将导致空指针异常。
我还建议删除head.next
和oldfirst
,并根据上述理论更新lasthead
*方法。
答案 1 :(得分:0)
这实际上不是一个链接列表,它更像是一个有后部和前部指针的队列。 在显示列表中的项目时,您使用的是“head”指针,而从开始删除时您使用的是“lasthead”。这将移动最后一个但不会再将值分配给头部。
public void deleteFromStart(){
while(lasthead!=null){
this.lasthead=lasthead.next;
}
head = this.lasthead;
}
我尝试了这段代码,从一开始就删除了所有元素(我希望这是你想要的)
删除第一个元素:
public void deleteElementAtStart()
{
if(lasthead != null)
{
this.lasthead = lasthead.next;
}
else
{
System.out.println("List is already empty!");
}
head = lasthead;
}
编辑它。
答案 2 :(得分:0)
谢谢大家!我意识到我的错误,我正在使用额外的对象,这就是为什么在解决方案中我得到了这两种方法。
public void deleteFromStart(){
while(lasthead.next!=null){
lasthead=lasthead.next;
head=lasthead;
break;
}
}
或
public void deleteFromStart(){
while(head.next!=null){
head=head.next;
break;
}
}