92. 反转链表 II
题目描述
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
输入输出
1 2 3 4 5
| 输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
输入:head = [5], left = 1, right = 1 输出:[5]
|
基本思路
几个关键要点:
- 头结点有可能有变化 所以新设置了一个头结点
pre
指针走到left
前一位 rightNode
走到right
pre.next = leftNode
然后对[leftNode, rightNode]
这一段链表断链并反转
- 反转之后重新接上
left.next = rightNode
leftNode.next = cur
1 2 3 4 5
| left right pre cur leftNode rightNode 1 -> 2 -> 3 -> 4 -> 5 1 -> 4 -> 3 -> 2 -> 5
|
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { ListNode dummyNode = new ListNode(-1); dummyNode.next = head;
ListNode pre = dummyNode; for(int i = 0; i < left - 1; i++){ pre = pre.next; }
ListNode rightNode = pre; for(int i = 0; i < right - left + 1; i++){ rightNode = rightNode.next; }
ListNode leftNode = pre.next; ListNode cur = rightNode.next; pre.next = null; rightNode.next = null; reverseLinkedList(leftNode);
pre.next = rightNode; leftNode.next = cur; return dummyNode.next;
}
public void reverseLinkedList(ListNode head){ ListNode cur = head, pre = null; while(cur != null){ ListNode tmp = cur.next; cur.next = pre; pre = cur; cur = tmp; } } }
|