目录
两两交换链表中的节点
建立虚拟头节点+创建三个指针进行互换
//给出头节点
LinkeNode *dummyHead=new ListNode(0);
dummyHead->next=head;
LinkeNode *cur=dummyHead;
while(cur->next!=NULL&&cur->next->next!=NULL)
{
ListNode *tmp=cur->next;
ListNode *tmp2=cur->next->next->next;
cur->next=cur->next->next;
cur->next->next=tmp;
cur->next->next->next=tmp2;
cur=cur->next->next;
}
return
删除链表的倒数第N个节点
关键点:用快慢指针找到要删除的节点位置的时候,fast要再往前走一步,因为slow指针要停留在要删除的节点的前一位
ListNode *dummyHead=new ListNode(0);
dummyHead->next=head;
ListNode *fast=dummyHead;
ListNode *slow=dummyHead;
while(n--&&fast!=NULL)
{
fast=fast->next;
}
fast=fast->next;
while(fast!=nullptr)
{
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
return dummyHead->next;
链表相交
关键点:还是利用长度差
/求两链表长度差
ListNode *curA=headA;
ListNode *curB=headB;
int sizeA=0,sizeB=0;
while(curA!=NULL)
{
sizeA++;
curA=curA->next;
}
while(curB!=NULL)
{
sizeB++;
curB=curB->next;
}
//记得恢复原位置
curB=headB;
curA=headA;
//让长的链表做A
if(sizeB>sizeA)
{
swap(curA,curB);
swap(sizeA,sizeB);
}
int gap=sizeA-sizeB;
while(gap--)
{
curA=curA->next;
}
while(curA!=NULL)
{
if(curA==curB) return curA;
curB=curB->next;
curA=curA->next;
}
return NULL;