当前位置: 首页 > 图灵资讯 > 技术篇> 递归魔法:反转单链表

递归魔法:反转单链表

来源:图灵教育
时间:2023-05-23 09:26:37

整个链表递归反转

递归魔法:反转单链表_头结点

// 定义:输入单链表头结点,将链表反转,回到新的头结点Listnodee reverse(ListNode head) {    if (head == null || head.next == null) {        return head;    }    ListNode last = reverse(head.next);    head.next.next = head;    head.next = null;    return last;}

递归魔法:反转单链表_链表_02

输入 reverse(head) 之后,递归将在这里进行

递归魔法:反转单链表_头结点_03

这个 reverse(head.next) 执行完成后,整个链表就变成这样了:

递归魔法:反转单链表_头结点_04

head.next.next = head;

递归魔法:反转单链表_头结点_05

head.next = null;return last;

递归魔法:反转单链表_头结点_06

链表递归反转时,新的头结点是 last,而之前的 head 成为最后一个节点,别忘了链表的末尾要指向 null:

反转前N个节点

递归魔法:反转单链表_头结点_07

ListNode successor = null; // 后驱节点 存储N+1节点    ListNode reverseN(ListNode head, int n) {        if(n==1){            successor = hean.next;        }        ListNode last = reverseN(successor.next, n - 1);        head.next.next = head;        head.next = successor;        return last;    }

1、base case 变为 n == 1,反转一个元素,即它本身,并记录后驱节点。

2、刚才我们直接把它拿走了 head.next 设置为 null,因为原来的链表在整个链表反转后是原来的 head 成为整个链表的最后一个节点。但现在 head 递归反转后的节点不一定是最后一个节点,所以记录后驱 successor(第 n + 1 一个节点),反转后会 head 连接上。