无法删除LinkedList中的第一个节点

时间:2019-04-20 02:15:11

标签: java linked-list

我正在练习使用Java的LinkedList
这里main方法的目的是删除给定索引的节点。

除了第一个节点外,可以正确删除给定的节点。

如果我将
removeLastKthNode(head, lastKth);更改为
head = removeLastKthNode(head, lastKth),则可以。

但是我不知道为什么removeLastKthNode(head, lastKth)无法删除第一个节点。

Andreas给了我有关此问题的链接 Is Java "pass-by-reference" or "pass-by-value"?

但是,这里的问题是,当“ lastKth”未引用第一个节点(头节点)时,“ removeLastKthNode”的行为相当于“按引用传递”。

确保“ removeLastKthNode”在某种程度上表现得像“通过引用传递”。 但是,当“ lastKth = arr.length”时,为什么方法“ removeLastKthNode”的行为不像“按引用传递”?

这令人困惑。

下面的一些结果:
当“ lastKth = 6”时

Initial LinkedList:
2 4 6 8 11 3 7

After remove last6th LinkedList:
2 6 8 11 3 7

“ lastKth = 7”时

Initial LinkedList:
2 4 6 8 11 3 7

After remove last7th LinkedList:
2 4 6 8 11 3 7

节点定义:

public class Node {
    public int value;
    public Node next;
    public Node(int data) {
        this.value = data;
    }
}

主要代码:

import java.util.*;

public class RemoveLastKthNode_single {
    public static void main(String[] args) {
        int[] arr = {2, 4, 6, 8, 11, 3, 7};
        //Arrays.sort(arr);

        Node head = arrayToNode(arr);

        System.out.println("Initial LinkedList:");
        displayNode(head);

        System.out.println();
        int lastKth = 7;
        removeLastKthNode(head, lastKth);
        System.out.println("After remove last" + lastKth + "th" + " LinkedList:");
        displayNode(head);
    }

    // refer https://www.jianshu.com/p/0d0dbfcbc1c3
    public static Node arrayToNode(int[] arr) {
        Node head = new Node(arr[0]);
        Node other = head;
        for (int i = 1; i < arr.length; i++) {
            Node temp = new Node(arr[i]);
            other.next = temp;
            other = other.next;
        }
        return head;
    }

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

    public static Node removeLastKthNode(Node head, int lastKth) {
        if (head == null || lastKth < 1) {
            return head;
        }

        Node cur = head;
        while (cur != null) {
            lastKth --;
            cur = cur.next;
        }

        if (lastKth == 0) {
            head = head.next;
        }

        if (lastKth < 0) {
            cur = head;
            while (++lastKth != 0) {
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }

            System.out.println(head.value + " YES ");
        return head;
    }
}

感谢Andreas的评论。我知道它是如何工作的。

这是我的逻辑。对“头节点”的引用按值传递给“ removeLastKthNode”,因此在内存中我有一个头的副本。并且“ head”的副本也指向“下一个节点”。它看起来像一条“两头蛇”。我可以切割“身体”(因为它们是准确的),但是我不能切割一条蛇“头”,也不能切割另一条“头”。因为它们在内存中是不同的!

此处的图片。

<p style="text-align:center;"> <img src="https://i.stack.imgur.com/3dfHw.png" width="280" height="150"> </p> 

0 个答案:

没有答案