代码随想录训练营第四天|24.两两交换链表中的节点,19.删除链表的倒数第N个节点,链表相交,142.环形链表2

两两交换

24.

思路

和翻转链表的其实差不多,找到要交换的两个节点的前一位,然后

while(first!=NULL&&first->next!=NULL){
            ListNode* temp=first->next;
            cur->next=temp;
            first->next=temp->next;
            temp->next=first;
            cur=cur->next->next;
            first=first->next;
        }

在这里插入图片描述

犯过的错误

设置虚拟头结点时直接=head,应该dummyhead->next=head

ListNode* dummyhead=head;
ListNode* cur =dummyhead;
ListNode* first=head;		

删除链表的倒数第N个节点

19.删除倒数第N个

思路

在这里插入图片描述

代码实现

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyhead=new ListNode();
        dummyhead->next=head;
        ListNode*fast=dummyhead;
        ListNode*slow=dummyhead;
        int i=0;
        while(fast->next!=nullptr){
            if(i==n){
                slow=slow->next;
            }
            else
                i++;
            fast=fast->next;
        }
        ListNode* temp=slow->next;
        slow->next=temp->next;
        delete temp;
        return dummyhead->next;
    }
};

链表相交也是同样的思路,先分别获得长度m与n,
如果m短n长,那只用比较n的后m位,所以要先用一个指针来移动,
两者在同一位置后再一 一判断。

环形链表

环形链表
用了一个一次移动两个位置的快指针和一个正常移动的慢指针来判断是否是环形,如果不是环形两者不可能相交。
在这里插入图片描述
慢指针(x+y)*2=x+y+(z+y)*n,n必然>=1
x=(n-1)(z+y)+z
n=1时,说明x=z
让相遇点index2和头结点处的index1同时出发,则在入口处相遇。
n>1时,则转了n-1圈再走z后会和index1处在入口相遇。

代码

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* slow=head;
        ListNode* fast=head;
        while(fast!=NULL&&fast->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow){
                ListNode* index1=head;
                ListNode* index2=slow;
                while(index1!=index2){
                    index1=index1->next;
                    index2=index2->next;
                }
                return index1;
            }
        }

        return NULL;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值