Java反转链表(单向链表和双向链表)

本文介绍了如何使用Java解决单向链表和双向链表的反转问题。通过设置临时变量保存前后节点关系,逐个调整节点连接,实现链表的反转。提供详细代码示例并展示运行结果。
摘要由CSDN通过智能技术生成

这是一个常见的考验 Coding 能力的笔试题。
主要思路就是:
对于每个节点,使用临时变量记录原来的前驱和原来的后继,然后把原来的前驱接到这个节点的后继上。
代码如下:

public class ReverseList {

    public static class Node {
        public int value;
        public Node next;

        public Node(int data) {
            this.value = data;
        }
    }

    //单向链表反转
    public static Node reverseList(Node head) {
        //记录原前驱
        Node pre = null;
        //记录原后继的辅助变量
        Node next;
        while (head != null){
            //记录原后继
            next = head.next;
            //反转
            head.next = pre;
            //刷新前驱
            pre = head;
            //刷新当前节点
            head = next;
        }
        //运行到最后pre是新的头
        return pre;
    }

    public static class DoubleNode {
        public int value;
        //前驱
        public DoubleNode pre;
        //后继
        public DoubleNode next;

        public DoubleNode(int data) {
            this.value = data;
        }
    }

    //双向链表反转
    public static DoubleNode reverseList(DoubleNode head) {
        //记录原前驱
        DoubleNode pre = null;
        //记录原后继的变量
        DoubleNode next;
        while (head != null){
            //记录原后继
            next = head.next;
            //反转
            head.next = pre;
            head.pre = next;
            //刷新前驱
            pre = head;
            //刷新当前节点
            head = next;
        }
        //运行到最后pre是新的头
        return pre;
    }

    public static void printLinkedList(Node head) {
        System.out.print("Linked List: ");
        while (head != null) {
            System.out.print(head.value + " ");
            head = head.next;
        }
        System.out.println();
    }

    public static void printDoubleLinkedList(DoubleNode head) {
        System.out.print("Double Linked List: ");
        DoubleNode end = null;
        while (head != null) {
            System.out.print(head.value + " ");
            end = head;
            head = head.next;
        }
        System.out.print("| ");
        while (end != null) {
            System.out.print(end.value + " ");
            end = end.pre;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node head1 = new Node(1);
        head1.next = new Node(2);
        head1.next.next = new Node(3);
        printLinkedList(head1);
        head1 = reverseList(head1);
        printLinkedList(head1);

        DoubleNode head2 = new DoubleNode(1);
        head2.next = new DoubleNode(2);
        head2.next.pre = head2;
        head2.next.next = new DoubleNode(3);
        head2.next.next.pre = head2.next;
        head2.next.next.next = new DoubleNode(4);
        head2.next.next.next.pre = head2.next.next;
        printDoubleLinkedList(head2);
        printDoubleLinkedList(reverseList(head2));

    }

}

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值