链表反转算法(迭代与递归)

链表节点类型

static class ListNode{
    int data;
    ListNode next;

    public ListNode(int data, ListNode next) {
        this.data = data;
        this.next = next;
    }
}

原链表

ListNode node5 = new ListNode(5, null);
ListNode node4 = new ListNode(4, node5);
ListNode node3 = new ListNode(3, node4);
ListNode node2 = new ListNode(2, node3);
ListNode node1 = new ListNode(1, node2);

image-20210423160713322

迭代法

// 迭代
public static ListNode iteration(ListNode head){
    ListNode next, prev = null;
    ListNode curr = head;
    while (curr != null){
        next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}

image-20210423162933728

  • next : 用于存储下一个节点,防止指针方向反转之后找不到后续链表
  • curr : 用于操作当前节点
  • prev : 用于存储上一个节点

递归法

// 递归
public static ListNode recursion(ListNode head){
    if (head == null || head.next == null){
        return head;
    }else {
        ListNode new_head = recursion(head.next);
        head.next.next = head;
        head.next = null;
        return new_head;
    }
}

image-20210423164754731

  • new_head :新的头节点,当递归函数开始返回时,其指向永远为原链表的最后一个节点
public class A1_ReverseList {
    static class ListNode{
        int data;
        ListNode next;

        public ListNode(int data, ListNode next) {
            this.data = data;
            this.next = next;
        }
    }
    public static void main(String[] args) {
        // 链表
        ListNode node5 = new ListNode(5, null);
        ListNode node4 = new ListNode(4, node5);
        ListNode node3 = new ListNode(3, node4);
        ListNode node2 = new ListNode(2, node3);
        ListNode node1 = new ListNode(1, node2);

        System.out.println("原链表:");
        for(ListNode i = node1; i != null; i = i.next){
            System.out.print(i.data+"->");
        }

        ListNode prev = iteration(node1);
        System.out.println("\n迭代反转后的链表:");
        for(ListNode i = prev; i != null; i = i.next){
            System.out.print(i.data+"->");
        }

        ListNode new_head = recursion(prev);
        System.out.println("\n递归再次反转后的链表:");
        for(ListNode i = new_head; i != null; i = i.next){
            System.out.print(i.data+"->");
        }
    }
    // 迭代
    public static ListNode iteration(ListNode head){
        ListNode next, prev = null;
        ListNode curr = head;
        while (curr != null){
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
    // 递归
    public static ListNode recursion(ListNode head){
        if (head == null || head.next == null){
            return head;
        }else {
            ListNode new_head = recursion(head.next);
            head.next.next = head;
            head.next = null;
            return new_head;
        }
    }
}

image-20210423165239808

posted @ 2021-04-23 21:24  monarch_bai  阅读(145)  评论(0)    收藏  举报