206. 反转链表
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode * prev = NULL;
ListNode * cur = head;
while(cur){
ListNode * tp = cur->next;
cur->next = prev;
prev = cur;
cur = tp;
}
return prev;
}
};
92. 反转链表 II
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode * dummy = new ListNode(0,head),*p = dummy;
for(int i = 0; i < left - 1; i++) p = p -> next;
ListNode * prev = NULL, * cur = p->next;
int n = right - left + 1;
while(n--){
ListNode * tp = cur -> next;
cur ->next = prev;
prev = cur;
cur = tp;
}
p->next->next = cur;
p->next =prev;
return dummy->next;
}
};
//从原链表的顺序上来看
//prev指向最后一个节点,cur指向这一段后续的一个节点, p为这一段的前一个节点
25. K 个一组翻转链表
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
//每一次反转结束后,从原链表上来看
// prev指向这一段的末尾,cur指向这一段后续的下一个节点
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
int n = 0;
for(ListNode * cur = head; cur; cur = cur->next)n++;//求长度
ListNode * dummy = new ListNode(0,head), *p0 = dummy;
ListNode * prev = NULL, *cur = head;
while(n >= k){
n -= k;
for(int i = 0; i < k; i++){
ListNode * tp = cur->next;
cur->next = prev;
prev = cur;
cur = tp;
}
ListNode * tp = p0->next;
p0->next->next = cur;
p0 ->next = prev;
p0 = tp;
}
return dummy->next;
}
};