【发布时间】:2021-07-18 17:51:37
【问题描述】:
我创建了一个双向循环链表,并想删除一个具有给定值的节点。如果我们假设有一个循环双向链表,节点值为 11,12,13,14,其中 11 是头节点。那么要删除值为 11 的节点,我们需要将前一个指针 12 指向 14,节点 14 的下一个指针必须设置为 12,然后将 12 设为头节点。所以,现在如果我们选择显示列表答案应该是 12,13,14 但出乎意料的答案是 12,13,14,11。当我添加行号时。 19(下面提到的删除功能)到代码,显示预期的输出。因此,我想知道逻辑是否正确并且我们已经更改了所有前一个和下一个指针值,那么为什么输出不同。如果我想要删除第一个节点,即头节点,那么为什么我们应该将下一个值设置为空(如第 19 行(下面提到的删除功能)?
节点结构:
public class Node{
int data;
Node next,prev; //next and previous pointers for a node
}
删除函数
1 public void del(int x)
2 {
3 Node n=head;
4 do{
5 if(n.data==x){break;}
6 n=n.next;
7 }
8 while(n.data!=x);
9 if(n.data==x && n!=head) //for deleting any other node except first node
10 {
11 n.next.prev=n.prev;
12 n.prev.next=n.next;
13 }
14 else if(n.data==x && n==head) //for first node deletion
15 {
16 head.next.prev=head.prev;
17 head.prev.next=head.next;
18 head=head.next;
19 // n.next=null;
20 }
21 else{System.out.println("Element not found");}
22 }
PS:我还尝试打印节点以及下一个值,即使在将节点 14 的下一个指针从 11 更改为 12(即删除 11)之后,node.next 仍然打印 11 作为节点的下一个14.为什么? 显示功能代码如下:
public void display()
{
Node n=head;
if (head != null)
{
do
{
System.out.println(n.data+" and its next is "+n.next.data);
n=n.next;
}while(n!=head);
System.out.println("");
}
else{System.out.println("Please add an entry to the linked list");}
}
【问题讨论】:
-
你能显示添加的代码吗?
-
FYI 1: 如果找不到
x,代码将永远运行。 --- FYI 1b: 代码无法访问:else{System.out.println("Element not found");}--- FYI 2: 如果列表为空,代码将抛出NullPointerException。 --- 仅供参考 3:do{ if(n.data==x){break;} n=n.next; } while(n.data!=x);最好写成while (n.data != x) { n = n.next; }。
标签: java data-structures linked-list doubly-linked-list