1 题目
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
2 思路
这道题思路主要是考察指针,并不是很难,只需要先找到要翻转元素的头和尾,然后头尾互换,并将其与原列表连接在一起,最后再翻转内部的元素即可
3代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @param {number} m
* @param {number} n
* @return {ListNode}
*/
var reverseBetween = function(head, m, n) {
if (!head || !head.next || m === n) return head;
let i = 1;
let rHead,rTail;
let linkHead = head;
while(head) { // 找到要翻转元素的头和尾
if (m === i) rHead = head;
if (n === i) {
rTail = head;
break;
}
if (head.next) head.next.prev = head;
head = head.next;
i++;
}
if (rHead.prev) { //将翻转后元素的头连接到原列表
rHead.prev.next = rTail;
} else {
linkHead = rTail;
}
rHead.next = rTail.next; //将翻转后元素的尾连接到原列表
i = n - m;
while(i > 0) { //将内部元素翻转
rTail.next = rTail.prev;
rTail = rTail.prev;
i--;
}
return linkHead;
};
本文介绍了一种在链表中反转指定区间[m, n]的算法实现,通过一趟扫描完成,确保了高效性。该算法首先定位待反转部分的头尾节点,然后调整链接使其与原链表断开,接着进行内部元素的反转,最后重新连接到链表中。
368

被折叠的 条评论
为什么被折叠?



