使用Java删除具有给定值的所有节点

时间:2016-03-13 05:27:43

标签: java linked-list

我需要删除具有给定值的所有节点。但是,我的代码删除了它们,但我得到的最终结果是,如果值是在头部,它不会删除。我该如何解决这个问题?

splrep

2 个答案:

答案 0 :(得分:0)

您显示的代码是正确的。我添加了一点来得到一个完整的例子:

public class LinkedListNode {
    public LinkedListNode next;
    public int value;
}

public class LinkedListTest {

    public static LinkedListNode remove(LinkedListNode head, int value) {
        if (head == null) {
            return head;
        }
        LinkedListNode current = head;
        LinkedListNode trailcurrent = null;
        while (current != null) {
            if (current.value == value) {
                if (current == head) {
                    head = head.next;
                    current = head;
                } else {
                    trailcurrent.next = current.next;
                    current = trailcurrent.next;
                }
            } else {
                trailcurrent = current;
                current = current.next;
            }
        }
        return head;
    }

    public static LinkedListNode createLinkedList(int... values) {
        LinkedListNode result = null;
        for (int i = values.length - 1; i >= 0; i--) {
            LinkedListNode n = new LinkedListNode();
            n.value = values[i];
            n.next = result;
            result = n;
        }
        return result;
    }

    public static void printList(LinkedListNode head) {
        while (head != null) {
            System.out.print(head.value+" ");
            head = head.next;
        }
        System.out.println();
    }

    public static void main(String... args) {
        LinkedListNode head = createLinkedList(3,5,3,2);
        printList(head);
        head = remove(head, 3);
        printList(head);
        printList(remove(head, 5));
    }
}

并打印

3 5 3 2
5 2
2

所以问题必须在你所展示的代码之外的某个地方。

答案 1 :(得分:0)

我试图在我的系统上运行代码,但是进行了一些更改。该程序运行良好:)但我找到了一个洞察力,我认为你会觉得有趣。无论如何,代码如下所示:

  

ListNode.java

public class ListNode<T>{
    public T data;
    public ListNode<T> next;
    public int nos;
}
  

LinkedListPer.java

public class LinkedListPer {
    //ListNode<Integer> list = new ListNode<Integer>();
    ListNode<Integer> add(ListNode<Integer> head, int x){
        ListNode<Integer> p = head;
        if(head==null){
            head = new ListNode<Integer>();
            head.data = x;
        }else{
            while(p.next!=null){
                p=p.next;
            }
            p.next = new ListNode<Integer>();
            p.next.data = x;
        }
        return head;
    }

    void display(ListNode<Integer> head){
        ListNode<Integer> p = head;
        while(p.next!=null){
            System.out.print(p.data+"->");
            p = p.next;
        }
        System.out.println("NULL");
    }

    ListNode<Integer> delete(ListNode<Integer> head, int val){
        if(head==null){
            return head;
        }

        ListNode<Integer> prev = head;
        ListNode<Integer> curr = head;

        while(curr.next!=null){
            if(curr.data == val){
                if(curr==head){
                    head = curr.next;
                    curr = head;
                }else{
                    prev.next = curr.next;
                    curr = prev.next;
                }
            }else{
                prev = curr;
                curr = curr.next;
            }
        }
        return head;
    }
}

在main中运行以下代码。

        LinkedListPer dh = new LinkedListPer();
        ListNode<Integer> ln = null;
        ln = dh.add(ln, 1);
        ln = dh.add(ln,2);
        ln = dh.add(ln,1);
        ln = dh.add(ln,4);
        ln = dh.add(ln,6);

        dh.display(ln);

        ln = dh.delete(ln, 1);
        dh.display(ln);

我得到了以下输出:

  

1->2->1->4->NULL

     

2->4->NULL

现在为Insight: 在执行delete()操作之前,我没有保存同样返回的值。即我只写了以下声明。

dh.delete(ln,1)

输出如下:

  

1->2->1->4->NULL

     

1->2->4->NULL

所以,我认为这恰好符合你所面临问题的行为。我认为问题在于在执行删除操作后使用head