反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明: 1 ≤ m ≤ n ≤ 链表长度。
题目要求是一次遍历实现。想法:假如需要反转的节点段是a -> b -> c -> d,那么首先设置一个节点temp,使得temp.next指向a,便于反转。之后,设置指针节p点始终指向a,为需要反转的第一个节点(也是反转后的最后一个节点);设置指针节点q指向此次待反转的节点,设置指针节点y指向每次反转后的第一个节点。

class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
// 若链表为空、只有一个节点或者m=n,无需反转
if(m==n || head==null || head.next==null){
return head;
}
// 构造一个空节点,next指向head
ListNode X = new ListNode(-1);
X.next = head;
// 构造指针节点,便于反转
ListNode temp = X;
// 构造指针节点,指向第一个待反转的节点,即反转过后的最后一个节点
ListNode p = temp.next;
// 构造指针节点,指向此刻需要反转的节点
ListNode q = new ListNode();
// 构造指针节点,指向已经反转后的第一个节点
ListNode y = new ListNode();
// number表示指向第几个节点
int number = 1;
// 时间复杂度为O(n)
while(number < n){
if(number >= m){
q = p.next;
temp.next = q;
p.next = q.next;
if(number == m){
q.next = p;
}
else{
q.next = y;
}
y = q;
}
else{
temp = temp.next;
p = p.next;
}
number ++;
}
return X.next;
}
}
执行用时:0 ms;内存消耗:37.2 MB。
本文介绍了如何一次性遍历解决LeetCode第92题,即反转链表中从位置m到n的部分。通过设置temp、p、q和y四个指针,可以在一次遍历中完成链表反转。执行该算法的时间复杂度为O(n),空间复杂度为O(1),实现了高效的空间和时间效率。

402

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



