思路:
- 建立虚拟节点dummy
- 找各个节点的位置(left, right, left上一个位置, right下一个位置)
- left–>right进行翻转(参照206题)
- left,right 找下一个节点
- 返回虚拟节点下一个节点
代码:
class Solution {
public ListNode reverseBetween(ListNode head, int left, int right) {
if(left == right) {
return head;
}
//1. 建立虚拟节点dummy
ListNode dummy = new ListNode(-1);
dummy.next = head;
//2. 找各个节点的位置(left, right, left上一个位置, right下一个位置)
ListNode a = dummy;
ListNode b = dummy;
for(int i = 0; i < left - 1; i ++) {
a = a.next;
}
for(int j = 0; j < right; j ++) {
b = b.next;
}
ListNode c = a.next;
ListNode d = b.next;
//3. left-->right进行翻转(参照206题)
ListNode p = c;
ListNode q = c.next;
while(q != d) {
ListNode o = q.next;
q.next = p;
p = q;
q = o;
}
//4. left,right 找下一个节点
a.next = b;
c.next = d;
//5. 返回虚拟节点下一个节点
return dummy.next;
}
}
思路:
建立两个指针a,b分别指向头节点以及下一节点,首先,用指针c记录b的下一个位置,之后将指针b的下一个位置指向a;之后移动指针a到b,移动指针b到c,直到指针b指向null,结束这个过程。最后将原来的头指向null,head指向a。(或者这里直接返回a也行)
代码:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null) {
return head;
}
ListNode a = head;
ListNode b = head.next;
while(b != null) {
ListNode c = b.next;
b.next = a;
a = b;
b = c;
}
head.next = null;
head = a;
return head;
}
}
链表的题目我觉得画图做可太明了了,找到一个测试用例,完全就可以解决整个题目,刷题路太长,且行且珍惜,呜呜呜!!!