尝试删除单一循环链接列表中的节点

时间:2016-08-06 01:42:12

标签: java singly-linked-list circular-list

我试图删除具有给定键的节点,并且还想显示更新的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

此代码

后没有任何反应

2 个答案:

答案 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仍然指向循环列表。

还有两个问题:

  • Major:delete()方法不处理删除列表的最后一个元素
  • Minor: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;   

    }

}