Я практикуюсь с использованием 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>