描述
翻转一个链表
特殊要求:请使用以下链表结构
class Node
{
int value;
Node next;
}
输入
输入包含多组数据。对于每组数据:
第一行是n,表示链表长度;当n=-1时,表示输入结束。(1 <= n <= 100)
第二行是n个整数,表示链表每一位所存储的内容。
输出
针对每组输入,输出翻转后的链表的内容。
样例输入
4
1 3 5 7
-1
样例输出
7 5 3 1
思路:单链表的翻转,三指针遍历链表,每次逆置前两个节点,直到第二个节点为空,最后处理头尾
为什么要用三个指针?由于单链表只有后继指针,为了遍历整个链表必须在逆置节点前复制后一个节点,否则将丢失后续链表------具体操作的注释在源码里参考**
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) {// 只有一个节点,题目已知最少含有一个结点
System.out.println(p1.value);
System.exit(0);
}
while (p2.value != -1) {// 为了p3指针不指向空,申请额外一个结点-1代指尾结点
if (p1 == head.next) {// 恰好为第一个节点的处理,next悬空
p1.next = null;
}
p2.next = p1;// 前两个节点的翻转
// 三个指针向后移动
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;
}
}
}