描述
翻轉(zhuǎn)一個(gè)鏈表
特殊要求:請(qǐng)使用以下鏈表結(jié)構(gòu)
class Node
{
int value;
Node next;
}
輸入
輸入包含多組數(shù)據(jù)。對(duì)于每組數(shù)據(jù):
第一行是n,表示鏈表長(zhǎng)度;當(dāng)n=-1時(shí),表示輸入結(jié)束。(1 <= n <= 100)
第二行是n個(gè)整數(shù),表示鏈表每一位所存儲(chǔ)的內(nèi)容。
輸出
針對(duì)每組輸入,輸出翻轉(zhuǎn)后的鏈表的內(nèi)容。
樣例輸入
4
1 3 5 7
-1
樣例輸出
7 5 3 1
思路:?jiǎn)捂湵淼姆D(zhuǎn),三指針遍歷鏈表,每次逆置前兩個(gè)節(jié)點(diǎn),直到第二個(gè)節(jié)點(diǎn)為空,最后處理頭尾
為什么要用三個(gè)指針?由于單鏈表只有后繼指針,為了遍歷整個(gè)鏈表必須在逆置節(jié)點(diǎn)前復(fù)制后一個(gè)節(jié)點(diǎn),否則將丟失后續(xù)鏈表------具體操作的注釋在源碼里參考**
Java代碼參考
import java.util.Scanner;
public class ReverseSingleList {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Node head = new Node(0);// 啞元
Node p = head;
while (true) {
n = sc.nextInt();
p.next = new Node(n);
p = p.next;
if (n == -1)
break;
}
Node ans = reverseList(head);
printList(ans);
}
private static Node reverseList(Node head) {
Node p1 = head.next;
Node p2 = p1.next;
Node p3 = p2.next;
if (p2.value == -1) {// 只有一個(gè)節(jié)點(diǎn),題目已知最少含有一個(gè)結(jié)點(diǎn)
System.out.println(p1.value);
System.exit(0);
}
while (p2.value != -1) {// 為了p3指針不指向空,申請(qǐng)額外一個(gè)結(jié)點(diǎn)-1代指尾結(jié)點(diǎn)
if (p1 == head.next) {// 恰好為第一個(gè)節(jié)點(diǎn)的處理,next懸空
p1.next = null;
}
p2.next = p1;// 前兩個(gè)節(jié)點(diǎn)的翻轉(zhuǎn)
// 三個(gè)指針向后移動(dòng)
p1 = p2;
p2 = p3;
p3 = p3.next;
}
head.next = p1;
return head;
}
private static void printList(Node head) {
Node p = head.next;
while (p != null) {
if(p.next == null)
System.out.print(p.value);
else
System.out.print(p.value + " ");
p = p.next;
}
}
private static class Node {
int value;
Node next;
public Node(int value) {
super();
this.value = value;
}
}
}