92.反转链表II
这道题需要1.找到位置left 2.在位置left开始,一前一后两个指针反转链表,代码同206.反转链表,直到后一个指针指向right 3.把反转后的头节点链接到left-1后面,把反转后的链表尾节点指向right+1位置的节点
因为可能会反转head指向的节点
所以需要重新构造一个头节点指向head
防止头节点位置改变
cpp
ListNode* dummy = new ListNode(0);
dummy->next = head;
然后for循环先找到left
cpp
ListNode* pre = dummy;
ListNode* cur=head;
ListNode* next=nullptr;
for(int i=1;i<=right;i++)
{
if(i<left){
pre=pre->next;
cur=cur->next;
}
}
cur节点指向left位置的节点,使用反转链表反转直到cur指向right
cpp
ListNode* pre = dummy;
ListNode* cur=head;
ListNode* next=nullptr;
for(int i=1;i<=right;i++)
{
if(left<=i&&right>=i)
{
ListNode* tmp=cur->next;
cur->next=next;
next=cur;
cur=tmp;
}
else if(i<left){
pre=pre->next;
cur=cur->next;
}
}
接着链接头尾和反转链表
pre指向left-1的位置
pre的下一个指针,也就是反转前的left位置,此时,该指针指向反转链表的尾部
因此,将反转链表的尾部指向right+1的位置,也就是cur
让pre指向反转链表头节点,也就是next
cpp
pre->next->next = cur;
pre->next = next;
143.重排链表
双指针求中点+双指针反转链表
从开头出发,快指针走两步,慢指针走一步
快指针走到尾巴的时候,慢指针走到中点
cpp
ListNode* left=head;
ListNode* right=head;
if(head==NULL&&head->next==NULL)
return;
while(right->next!=NULL&&right->next->next!=NULL)
{
right=right->next;
right=right->next;
left=left->next;
}
在纸上模拟一下寻找的过程,我们就知道链表中无论是偶数个节点还是奇数个节点,left永远指向左半边链表的最后一个节点
接着我们反转后半部分链表,也就是left->next的部分
使用一前一后两个指针
后一个节点指向前一个节点
等节点指向链表尾部,就结束了
不过我们首先也要把前半段节点末尾改成指向NULL
cpp
ListNode* cur=left->next;
left->next=NULL;
ListNode* pre=NULL;
while(cur!=NULL)
{
ListNode* tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
两端链表都准备好了,接下来就是合并两个链表
两个指针分别指向两个链表的头节点
挨个合并
cpp
cur=pre;
pre=head;
while(pre!=NULL&&cur!=NULL)
{
ListNode* tmp=pre->next;
pre->next=cur;
right=cur->next;
cur->next=tmp;
cur=right;
pre=tmp;
}
最后得到整个代码
cpp
/**
* 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:
void reorderList(ListNode* head) {
ListNode* left=head;
ListNode* right=head;
if(head==NULL&&head->next==NULL)
return;
while(right->next!=NULL&&right->next->next!=NULL)
{
right=right->next;
right=right->next;
left=left->next;
}
ListNode* cur=left->next;
left->next=NULL;
ListNode* pre=NULL;
while(cur!=NULL)
{
ListNode* tmp=cur->next;
cur->next=pre;
pre=cur;
cur=tmp;
}
cur=pre;
pre=head;
while(pre!=NULL&&cur!=NULL)
{
ListNode* tmp=pre->next;
pre->next=cur;
right=cur->next;
cur->next=tmp;
cur=right;
pre=tmp;
}
}
};