反转链表II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置right 的链表节点,返回 反转后的链表 。
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
|
方法:分解后拼接
算法思路:
- 设置哑节点
dummyNode,记录开始位置。
- 设置
pre节点,位移到需反转链表前一位,设置节点leftNode = pre.next后,执行pre.next = null断开链接。
- 设置
rightNode = pre,位移至需反转链表末位,记录cur = rightNode.next,执行rightNode.next = null断开链接。
- 编写反转链表代码,反转
leftNode。
pre.next = rightNode与leftNode.next = cur链接三段链表。
代码实现:
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 leftNode = pre.next; ListNode rightNode = pre; for(int i = 0; i < right - left + 1; i++){ rightNode = rightNode.next; } pre.next = null; ListNode cur = rightNode.next; rightNode.next = null;
reverseListNode(leftNode); pre.next = rightNode; leftNode.next = cur;
return dummyNode.next; }
public void reverseListNode(ListNode head){ ListNode pre = new ListNode(-1); ListNode cur = head; while(cur != null){ ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; } } }
|
复杂度分析:
- 时间复杂度:O(n),其中n是链表总节点数。最坏情况下,需要遍历整个链表。
- 空间复杂度:O(1)。只使用到常数个变量。
参考:
LeetCode官方题解 - 92.反转链表II