【发布时间】:2014-01-30 22:26:22
【问题描述】:
我在从专门删除头节点的循环链表中删除节点时遇到了一些麻烦。我尝试调试代码,我发现的问题是头节点在删除后没有得到更新。这意味着如果我的列表是 1->2->3->1(这里末尾的 1 实际上是头节点 1 的重复以显示循环链接列表),在尝试删除 '1' 后,列表变为 1->2- >3->2...所以基本上头节点没有得到更新,因此当我尝试打印这个链表时,它进入无限循环,因为头节点只遇到一次并且不再满足停止条件。以下是我为删除而编写的代码
public class cirlinklist {
private int data;
private cirlinklist next;
private cirlinklist head;
public cirlinklist()
{
data = 0;
next = this;
}
public cirlinklist(int val)
{
data = val;
next = this;
}
public void cirlist(int val)
{
cirlinklist node = new cirlinklist(val);
if(this.next == this) //only one node present
{
node.next = this;
this.next = node;
}
else
{
cirlinklist temp = this.next;
//cirlinklist head = this;
/*while(node != head)
node = node.next;*/
node.next = temp.next; //adding after the last added node.For adding before last added node change to temp here and temp.next in next line
this.next.next = node;
}
}
public void printlist()
{
//cirlinklist head = this; //start node
cirlinklist node = this; //node for traversing and printing
System.out.println("Circular Link list data is:");
do
{
System.out.println(node.data);
node = node.next;
}
while(node != head);
System.out.println(node.data);
}
public void check()
{
}
public cirlinklist delete(int val)
{
head = this;
cirlinklist node = head;
cirlinklist node2 = node;
if(head.data == val) //if the node to be deleted is head node
{
//this = this.next;
while(node.next != head) //iterate till the last node i.e. the node which is pointing to head
{
node = node.next;
}
node.next = node.next.next; // update current node pointer to next node of head
//node = node.next;
head = head.next; //update head node
/*this.next = head.next.next;
this.data = head.next.data;*/
return this;
}
else // if node to be deleted is other than head node
{
while(node.data != val) // find the node
{
node = node.next;
node2.next = node;
}
node2.next = node.next; //updating next field of previous node to next of current node.current node deleted
node = null;
return this;
}
}
public static void main(String [] args)
{
cirlinklist obj = new cirlinklist(1);
cirlinklist obj2 = new cirlinklist();
//obj.cirlist(1);
obj.cirlist(2);
obj.cirlist(3);
obj.printlist();
obj2 = obj.delete(1);
System.out.println("Circular list after deletion is");
obj2.printlist();
}
}
请告诉我哪里出错了
【问题讨论】:
-
在你给我们的例子中,如果我想删除'1',它应该删除第一个和最后一个?
-
@HugoSousa 最后的'1'节点实际上只是头节点。因为它是循环链接列表所以我重复了'1'。实际上只有一个'1'是头节点
-
请注意,如果我们可以看到其余代码,调试起来会更容易,因为您所做的一切都是用 void 函数进行的,并且没有可见的全局数据使用。
-
@RyanJ 我已经在上面的帖子中进行了更改。我已经发布了完整的代码,并进行了一些修改,但仍然存在相同的无限循环问题
标签: java linked-list