hihoCoder——翻转链表(Java语言实现单链表基础算法)

描述
翻转一个链表
特殊要求:请使用以下链表结构
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;
        }

    }

}

你可能感兴趣的:(hihoCoder——翻转链表(Java语言实现单链表基础算法))