ListNode
递归反转
反转一个链表(用递归的方式):
1 | ListNode reverse(ListNode head){ |
关键的重点在于:ListNode last = reverse(head.next)
,此句在于将 head 之后的链表进行反转,反转之后,head 仍然指向 head 之后的第一个节点,而 last 指向的是 head 之后所有链表的最后一个节点。
设原链表:1,2,3,4
即:head->next—>( 2, 3, 4 —> null );
此时 head—>next—>next == 2
所以 head —> next—>next = head 即为 2 —> head ;
然后,head —>next = null 即将 head 变为最后一个节点,head 不应该再指向任何节点。
以上递归函数需要有 base case:
if(head.next == null) return head;
反转链表前 N 个节点
1 | ListNode successor = null; |
反转链表的一部分
1 | ListNode reverseBetween(ListNode head, int m, int n){ |