单链表逆转算法(Java)

939 阅读1分钟

单链表逆转主要有两种方式:递归、遍历,出于效率和数据量(递归栈深度相对有限)的考虑,采用遍历方式,以Java实现。

定义链表结构

public class ListNode {
        ListNode next;
        Integer data;

        public ListNode(Integer data) {
            this.data = data;
        }
    }

初始化链表

public ListNode init() {
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        ListNode node6 = new ListNode(6);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;

        return node1;
    }

算法部分

public ListNode reverse(ListNode listNode) {
        // 当前节点
        ListNode cur = listNode;
        // 前驱节点
        ListNode pre = null;
        // 后驱节点
        ListNode next;
        while (cur != null) {
            // 先保存后驱节点
            next = cur.next;
            // 将前后逆转
            cur.next = pre;
            // 前后驱节点向后移动
            pre = cur;
            cur = next;
        }

        // 前驱节点移动到最后,完成链表的逆序
        return pre;
    }

测试

 public static void main(String[] args) {
        Test test = new Test();
        ListNode listNode = test.init();
        ListNode listReverse = listNode;
        while(listNode != null){
            System.out.println(listNode.data);
            listNode = listNode.next;
        }

        System.out.println("===============================");
        listReverse = test.reverse(listReverse);
        while(listReverse != null){
            System.out.println(listReverse.data);
            listReverse = listReverse.next;
        }
    }

结果