Не удалось удалить первый узел в LinkedList, но удалось удалить другие узлы - PullRequest
1 голос
/ 20 апреля 2019

Я практикуюсь с использованием Java LinkedList.
Целью основного метода здесь является удаление узла данного индекса.

Указанный узел может быть удален правильно, кроме первого узла.

Если я изменилсяremoveLastKthNode(head, lastKth); вhead = removeLastKthNode(head, lastKth), это работает.

Но я не знаю, почему removeLastKthNode(head, lastKth) не может удалить первый узел.

Андреас дал мне ссылку на эту проблему Java "pass-by-reference "или" передача по значению "?

Однако проблема здесь в том, что" removeLastKthNode "ведет себя как" передача по ссылке ", когда" lastKth "не ссылается на первый узел(головной узел).

Уверен, что "removeLastKthNode" как-то ведет себя как "передача по ссылке".Но почему метод «removeLastKthNode» не ведет себя как «передача по ссылке», когда «lastKth = arr.length»?

Это сбивает с толку.

Некоторые результаты ниже:когда "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;
    }
}

Спасибо за комментарий Андреаса.Я выясняю, как это работает.

Вот моя логика.Ссылка на «головной узел» передается по значению в «removeLastKthNode», поэтому в памяти у меня есть копия заголовка.И копия «головы» также указывает на «следующий узел».Похоже, линия "две головы змеи".Я могу порезать «тело» (потому что оно точное), но я не могу порезать одну «голову» змеи и сделать так, чтобы другая «голова» тоже была порезана.Потому что они разные в памяти!

Изображение здесь.

<p style="text-align:center;"> <img src="https://i.stack.imgur.com/3dfHw.png" width="280" height="150"> </p> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...