如何打印链表的最后三个节点?
how to print the last three nodes of a linked list?
我尝试获取链表的最后三个节点的整个代码是:
节点 class:
package com.company;
public class Node {
public int data;
public Node nextNode;
public Node(int data) {
this.data = data;
this.nextNode = null;
}
public int getData() {
return data;
}
}
链表class;
package com.company;
public class LinkedList {
public Node head;
public int size;
public LinkedList() {
this.head = null;
this.size = 0;
}
public void add(int data) {
Node node = new Node(data);
if (head == null) {
head = node;
} else {
Node currentNode = head;
while(currentNode.nextNode != null) {
currentNode = currentNode.nextNode;
}
currentNode.nextNode = node;
}
size++;
}
public void printData() {
Node currentNode = head;
while(currentNode != null) {
int data = currentNode.getData();
System.out.println(data);
currentNode = currentNode.nextNode;
}
}
public void printLastThree(){
Node currentNode = head;
int i = this.size - 3;
while(i <= this.size) {
int data = currentNode.getData();
System.out.println(data);
currentNode = currentNode.nextNode;
i++;
}
}
}
主要class:
package com.company;
public class Main {
public static void main(String[] args) {
LinkedList ll = new LinkedList();
ll.add(1);
ll.add(2);
ll.add(3);
ll.add(4);
ll.add(5);
ll.add(6);
ll.add(7);
ll.add(8);
ll.add(9);
ll.add(10);
ll.add(11);
ll.add(12);
ll.printData();
System.out.println();
ll.printLastThree();
}
}
如您所见,在 linked list
class 中,我尝试使用 printLastThree()
方法打印链表的最后三个节点,但在控制台中我只得到:
1
2
3
4
我想得到:
10
11
12
你能告诉我我做错了什么吗?
我尝试在printLastThree()
方法中获取链表的总大小并减去3个位置,然后得到链表的总大小,但这不起作用。
谢谢。
错误在 printLastThree() 中。
您需要将currentNode从head移动到位置:size-3;但暂时不要打印它。
然后,再次从 size-3 移动到 size-1,并在移动过程中打印出来。
尝试 2 个 while 循环。后面也可以做成1个while循环从头到尾有if条件是否打印。
Once 从您的代码中可以看出 currentNode
作为 head
节点开始,并且它的值在循环的第一次迭代中打印出来。这不是你想要的。
您首先必须跳过 个节点,不会 打印这些节点。您已经计算出需要跳过多少这样的节点(this.size - 3
),因此您只需要添加循环即可实际跳过那么多节点:
public void printLastThree(){
Node currentNode = head;
// First SKIP nodes (not to be printed)
for (int i = size - 3; i > 0; i--) {
currentNode = currentNode.nextNode;
}
// ...and only then start printing
while (currentNode != null) {
int data = currentNode.getData();
System.out.println(data);
currentNode = currentNode.nextNode;
}
}
你也可以用一个循环来完成,并在当前索引上条件打印:
public void printLastThree(){
Node currentNode = head;
for (int i = 0; i < size; i++) {
if (i >= size - 3) { // Are we at the last three nodes?
int data = currentNode.getData();
System.out.println(data);
}
currentNode = currentNode.nextNode;
}
}
我尝试获取链表的最后三个节点的整个代码是: 节点 class:
package com.company;
public class Node {
public int data;
public Node nextNode;
public Node(int data) {
this.data = data;
this.nextNode = null;
}
public int getData() {
return data;
}
}
链表class;
package com.company;
public class LinkedList {
public Node head;
public int size;
public LinkedList() {
this.head = null;
this.size = 0;
}
public void add(int data) {
Node node = new Node(data);
if (head == null) {
head = node;
} else {
Node currentNode = head;
while(currentNode.nextNode != null) {
currentNode = currentNode.nextNode;
}
currentNode.nextNode = node;
}
size++;
}
public void printData() {
Node currentNode = head;
while(currentNode != null) {
int data = currentNode.getData();
System.out.println(data);
currentNode = currentNode.nextNode;
}
}
public void printLastThree(){
Node currentNode = head;
int i = this.size - 3;
while(i <= this.size) {
int data = currentNode.getData();
System.out.println(data);
currentNode = currentNode.nextNode;
i++;
}
}
}
主要class:
package com.company;
public class Main {
public static void main(String[] args) {
LinkedList ll = new LinkedList();
ll.add(1);
ll.add(2);
ll.add(3);
ll.add(4);
ll.add(5);
ll.add(6);
ll.add(7);
ll.add(8);
ll.add(9);
ll.add(10);
ll.add(11);
ll.add(12);
ll.printData();
System.out.println();
ll.printLastThree();
}
}
如您所见,在 linked list
class 中,我尝试使用 printLastThree()
方法打印链表的最后三个节点,但在控制台中我只得到:
1
2
3
4
我想得到:
10
11
12
你能告诉我我做错了什么吗?
我尝试在printLastThree()
方法中获取链表的总大小并减去3个位置,然后得到链表的总大小,但这不起作用。
谢谢。
错误在 printLastThree() 中。
您需要将currentNode从head移动到位置:size-3;但暂时不要打印它。
然后,再次从 size-3 移动到 size-1,并在移动过程中打印出来。
尝试 2 个 while 循环。后面也可以做成1个while循环从头到尾有if条件是否打印。
Once 从您的代码中可以看出 currentNode
作为 head
节点开始,并且它的值在循环的第一次迭代中打印出来。这不是你想要的。
您首先必须跳过 个节点,不会 打印这些节点。您已经计算出需要跳过多少这样的节点(this.size - 3
),因此您只需要添加循环即可实际跳过那么多节点:
public void printLastThree(){
Node currentNode = head;
// First SKIP nodes (not to be printed)
for (int i = size - 3; i > 0; i--) {
currentNode = currentNode.nextNode;
}
// ...and only then start printing
while (currentNode != null) {
int data = currentNode.getData();
System.out.println(data);
currentNode = currentNode.nextNode;
}
}
你也可以用一个循环来完成,并在当前索引上条件打印:
public void printLastThree(){
Node currentNode = head;
for (int i = 0; i < size; i++) {
if (i >= size - 3) { // Are we at the last three nodes?
int data = currentNode.getData();
System.out.println(data);
}
currentNode = currentNode.nextNode;
}
}