美文网首页Android代码封装
反转单链表(Java实现)

反转单链表(Java实现)

作者: FX_SKY | 来源:发表于2017-04-27 16:54 被阅读365次

如题:

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

代码实现

解题思路:

从表头节点依次遍历,将当前节点的后继指针指向它的前驱节点即可;此时需要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;
        }
    }

}

相关文章

  • 单链表反转

    单链表反转 单链表初始化 输出 反转 释放 实现代码 尚未实现 元素插入 元素删除

  • 链表简单算法相关练习

    单链表反转: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 迭代方式实现: 复杂度分析: 时...

  • 链表

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

  • 反转单链表(Java实现)

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

  • 单链表反转-Java实现

    算法1(非递归实现):使用3个指针,分别指向前序结点、当前结点和后序结点,遍历链表,逐个逆转,时间复杂度O(n):...

  • 反转单链表Java实现

    问题描述 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 解题思路 为了实现反转单链表,...

  • 单链表反转问题

    基本问题 如何将单链表反转? 单链表结构定义 算法实现 进阶问题 如何将单链表在指定区间内进行反转? 问题分析 这...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

  • LeetCode链表专题

    (一)LeetCode206.反转链表 题目描述: 反转一个单链表。 代码实现 (二)LeetCode160. 相...

  • 15反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头。 Java实现

网友评论

    本文标题:反转单链表(Java实现)

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