反转单链表(Java实现)

如题:

定义一个方法(函数),实现输入一个链表的头结点,然后可以反转这个链表的方向,并输出反转之后的链表的头结点。

代码实现

解题思路:

从表头节点依次遍历,将当前节点的后继指针指向它的前驱节点即可;此时需要prev、next分表记录当前节点的前驱节点和后继节点。

Node节点类:


    /**单向链表定义**/
    static class Node<T> {
        private T value;    //节点值
        private Node<T> next;   //后继节点

        public Node() {
        }
        public Node(T value, Node<T> next) {
            this.value = value;
            this.next = next;
        }
    }

初始化n个节点的链表,代码如下:


    /**初始化链表**/
    private Node initLinkedList(int num) {
        Node head = new Node(0, null);
        Node cur = head;
        for(int i=1; i<num;i++){
            cur.next = new Node(i, null);
            cur = cur.next;
        }
        return head;
    }

输出单链表方法:


    /**打印链表**/
    private void printLinkedList(Node head) {
        Node node = head;
        while(node != null){
            System.out.println(node.value);
            node = node.next;
        }
    }

接下来就是关键的


    /**反转链表**/
    private Node reverseLinkedList(Node head) {
        if (head == null || head.next==null) {
            return head;
        }

        Node prev = null;
        Node next = null;
        while(head.next!=null){
            next = head.next;   //保存下一个节点
            head.next = prev;   //重置next
            prev = head;    //保存当前节点
            head = next;
        }
        head.next = prev;
        return head;
    }

验证结果:

        Node head = initLinkedList(10);

        printLinkedList(head);

        System.out.println("**************");

        //反转链表
        Node node = reverseLinkedList(head);
        printLinkedList(node);

输出结果:

0
1
2
3
4
5
6
7
8
9
**************
9
8
7
6
5
4
3
2
1
0

完整代码如下:

package com.bytebeats.codelab.algorithm.datastructure;

/**
 * ${DESCRIPTION}
 *
 * @author Ricky Fung
 */
public class LinkedNodeDemo {

    public static void main(String[] args) {

        LinkedNodeDemo demo = new LinkedNodeDemo();
        demo.test();
    }

    public void test(){

        Node head = initLinkedList(10);

        printLinkedList(head);

        System.out.println("**************");

        //反转链表
        Node node = reverseLinkedList(head);
        printLinkedList(node);
    }

    /**反转链表**/
    private Node reverseLinkedList(Node head) {
        if (head == null || head.next==null) {
            return head;
        }

        Node prev = null;
        Node next = null;
        while(head.next!=null){
            next = head.next;   //保存下一个节点
            head.next = prev;   //重置next
            prev = head;    //保存当前节点
            head = next;
        }
        head.next = prev;
        return head;
    }

    /**初始化链表**/
    private Node initLinkedList(int num) {
        Node head = new Node(0, null);
        Node cur = head;
        for(int i=1; i<num;i++){
            cur.next = new Node(i, null);
            cur = cur.next;
        }
        return head;
    }

    /**打印链表**/
    private void printLinkedList(Node head) {
        Node node = head;
        while(node != null){
            System.out.println(node.value);
            node = node.next;
        }
    }

    /**单向链表定义**/
    static class Node<T> {
        private T value;    //节点值
        private Node<T> next;   //后继节点

        public Node() {
        }
        public Node(T value, Node<T> next) {
            this.value = value;
            this.next = next;
        }
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,488评论 0 16
  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,569评论 1 3
  • 作为一个资深的新手程序员😂,链表这些既基础又深奥的东西是日常工作中并不常见,但是却非常重要,所以就总结一下链表的简...
    Clark_new阅读 4,550评论 4 12
  • 本文内容:1、 什么是链表?2、 链表共分几类?3、 链表的 C 实现! 总表:《数据结构?》 工程代码 Gith...
    半纸渊阅读 40,224评论 0 54
  • 链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢? 可以...
    rainchxy阅读 2,291评论 0 6

友情链接更多精彩内容