反转链表
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) {
if(head==nullptr)
{
return head;
}
ListNode* pre=head;
ListNode* tail=head->next;
ListNode* nxt=nullptr;
while(tail!=nullptr)
{
nxt=tail->next;
tail->next=pre;
pre=tail;
tail=nxt;
}
head->next=nullptr;
return pre;
}
};
递归法摆烂了,看到这句话快去leetcode看题解!!!!!
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) {}
* };
*/
class Solution {
public:
pair<ListNode*,ListNode*> reverseList(ListNode* head,ListNode* end)
{
ListNode* pre=head;
ListNode* tail=head->next;
ListNode* nxt=nullptr;
while(tail!=end)
{
nxt=tail->next;
tail->next=pre;
pre=tail;
tail=nxt;
}
return {pre,head};
}
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* hNode=new ListNode(-1,head);//头节点
ListNode* pre=hNode;
ListNode* tail=hNode;
ListNode* nxt=nullptr;
int cnt=k;
while(tail!=nullptr)
{
while(cnt)
{
tail=tail->next;
cnt--;
if(tail==nullptr)
{
return hNode->next;
}
}
nxt=tail->next;//记下后面剩下的的链表的开头
pair<ListNode*,ListNode*> res=reverseList(pre->next,nxt);
pre->next=res.first;//接好翻转后的这小段子链表
pre=res.second;
pre->next=nxt;//接上后面的链表
tail=pre;
cnt=k;
}
return hNode->next;
}
};