美文网首页程序员
hihoCoder——翻转链表(Java语言实现单链表基础算法)

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

作者: 掌灬纹 | 来源:发表于2019-04-11 11:13 被阅读0次

描述
翻转一个链表
特殊要求:请使用以下链表结构
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语言实现单链表基础算法)

    描述翻转一个链表特殊要求:请使用以下链表结构class Node{int value;Node next;}输入输...

  • 单链表的C语言算法实现

    单链表的C语言算法实现 自己用C语言实现的单链表算法,有什么不正确的地方,请各位共同讨论与指正。

  • 链表

    单链表 C实现 Java实现 双链表 C实现 Java实现

  • 单链表算法题整理(思路详解)

    前一篇文章中记录了单链表的实现和基本操作,在此基础上,本次整理了单链表的相关常见算法题的思路和C语言实现,留作复习...

  • 数据结构与算法之链表(三)单链表的常用操作

    引言 在上篇文章数据结构与算法之链表(二)单链表的基本实现中我们学习了单链表的基本概念,本篇我们在此基础之上研究单...

  • Java实现单链表翻转

    解题思想 首先,拿到一个链表头结点now,(可以理解为当前指针所在位置)然后定义链表翻转后的头结点pre=null...

  • 单向链表反转(含图解)

    前言 上次讲解了单向链表的原理《Java实现单向链表功能》,今天拓展一下实现链表的翻转。下面直接上代码。 链表初始...

  • 算法题面试复习

    算法模块 1. 链表 1. 链表翻转 2. 单链表判断是不是环+求环位置+求环长度 以图片为例,假设环入口距离链表...

  • 翻转单链表

    翻转单链表 方法一:将单链表头插到一个新链表中 浪费空间,不过简单 方法二:使用三个指针遍历单链表,逐个点进行翻转...

  • 手写单链表实现和LRU算法模拟

    手写单链表,实现增删改查 根据单链表操作,实现LRU算法 新数据插入到链表头部当缓存命中(即缓存数据被访问),数据...

网友评论

    本文标题:hihoCoder——翻转链表(Java语言实现单链表基础算法)

    本文链接:https://www.haomeiwen.com/subject/udaziqtx.html