我试图删除具有给定键的节点,并且还想显示更新的Tail和Head节点值。我能够删除第一个节点(Head)并且无法删除Tail节点请检查下面的代码
public void delete(int key){
Node current = head;
while(current.next.data != key){
current = current.next;
}
if(current.next.data == key ){ //deleting current node
current.next = current.next.next;
if(current.next == head)
tail = current;
else if(current == head)
head = current.next;
}
}
我的主要方法:
public class Caller {
public static void main(String args[]){
Linklist theList = new Linklist();
theList.insertFirst(22);
theList.insertFirst(44);
theList.insertFirst(55);
theList.insertFirst(66);
theList.delete(22);
System.out.println("deleting 22");
theList.display();
theList.delete(66);
System.out.println("Deleting 66");
theList.insertLast(99);
theList.insertLast(11);
theList.display();
}
}
我的insertLast方法:
public void insertLast(int data){
Node newNode = new Node(data);
Node current = head;
while(current.next != head){
current = current.next;
}
current.next = newNode;
newNode.next = head;
tail = newNode;
}
我的输出是:
deleting 22
Displaying list first ----> last
{ 66 }
{ 55 }
{ 44 }
Head : 66 Tail: 44
Deleting 66
此代码
后没有任何反应答案 0 :(得分:0)
这是通过使用笔和纸一步一步地运行算法来最好地解决的问题之一。我认为问题不在于删除尾部节点,您自己的日志输出显示为正常工作,但删除头部节点(在这种情况下为“66”)。是的,最后插入了'66',但是它已被插入到列表中已有的任何其他内容之前,因此使其成为头节点。
问题是在更新头/尾指针之前更改循环列表的结构。在删除头节点的情况下,当代码到达current.next = current.next.next;
行时,current
指向尾节点,current.next
是头节点,current.next.next
是头+ 1节点。通过执行赋值,current.next
将指向head + 1节点,这意味着if(current.next == head)
和else if (current == head)
都不会触发。头节点现在位于循环列表之外,但head
指针仍然指向该节点;更糟糕的是,head.next
仍然指向循环列表。
还有两个问题:
if(current.next.data == key )
是不必要的,因为它实际上是前一个while循环的停止条件。答案 1 :(得分:0)
我一直跟踪前一节点和当前节点,并且它有效!
public void delete(int key){
Node current = head;
Node prev = current;
while(current.data != key){
prev = current;
current = current.next;
}
if(current.data == key ){ //deleting current node
if(current == head){
prev = tail;
head = current.next;
}else if(current == tail){
tail = prev;
head = current.next;
}
prev.next = current.next;
}
}