首页 > 其他分享 >(4/60)两两交换链表结点、删除链表倒数第N个结点、链表相交、环形链表

(4/60)两两交换链表结点、删除链表倒数第N个结点、链表相交、环形链表

时间:2024-01-28 20:55:26浏览次数:22  
标签:60 结点 ListNode cur fast next 链表 指针

两两交换链表结点

leetcode:24. 两两交换链表中的节点

迭代法

思路

第一步cur->next = cur->next->next

第二步cur->next->next = 原cur->next

第三步cur->next->next->next=原cur->next->next->next

注意用临时变量保存指针位置。

复杂度分析

时间复杂度:O(N)。

空间复杂度:O(1)。

注意点

  1. 画图辅助理解。

代码实现

/**
 * 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* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode();
        dummyHead->next = head;
        ListNode* cur = dummyHead;

        ListNode* tmp=NULL;
        ListNode* tmp1=NULL;
        
        while(cur->next && cur->next->next){
            tmp = cur->next;
            tmp1 = cur->next->next->next;

            cur->next = cur->next->next;    // step1
            cur->next->next = tmp;          // step2
            cur->next->next->next = tmp1;   // step3

            cur = tmp;
        }

        return dummyHead->next;
    }
};

递归法

暂时没看懂,略。


删除链表倒数第N个结点

leetcode:19. 删除链表的倒数第 N 个结点

双指针法

思路

最大问题就是找倒数第N,通过快指针比慢指针多走N步,定位到倒数第N个结点的前一个结点,然后就是简单链表删除操作。

复杂度分析

时间复杂度:O(N)。

空间复杂度:O(1)。

注意点

代码实现

/**
 * 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* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode();
        dummyHead->next = head;
        ListNode* fast = dummyHead;
        ListNode* slow = dummyHead;
        n++;
        while( n-- && fast != NULL){
            fast = fast->next;
        }
        while(fast != NULL){
            slow = slow->next;
            fast = fast->next;
        }

        ListNode* tmp = slow->next;
        slow->next = slow->next->next;
        delete tmp;

        return dummyHead->next;
    }
};

链表相交

leetcode:面试题 02.07. 链表相交

两端对齐法

思路

对比指针是否相同来确定是否相交。

复杂度分析

时间复杂度:O(N)。

空间复杂度:O(1)。

注意点

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 先算出各自长度
        // 根据长度尾端对齐,从前往后依次对比指针
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lengthA = 0,lengthB = 0;
        while(curA){
            curA = curA->next;
            lengthA++;
        }
        while(curB){
            curB = curB->next;
            lengthB++;
        }
		
        // 根据长度尾端对齐
        curA = headA;
        curB = headB;
        int diff = lengthA-lengthB;
        if(lengthA > lengthB){	// 如果A较长,移动A指针
            while(diff--)
                curA = curA->next;
        }else{	// 如果B较长,移动B指针
            diff = -diff;
            while(diff--)
                curB = curB->next;
        }
		
        // 从前往后依次对比指针
        while(curA && curB){
            if(curA == curB)
                return curA;
            else{
                curA = curA->next;
                curB = curB->next;
            }
        }

        return NULL;
    }
};

环形链表

leetcode:142. 环形链表 II

快慢指针法

思路

数学证明就不赘述了,卡哥已经讲的很清楚。有两个核心问题:

  1. 是否有环:快慢双指针遍历下去,指针相遇则有环。
  2. 如果有环,如何定位入口:快慢指针相遇时,此时再在头结点、相遇结点设置两个指针向后遍历,两指针相遇的结点就是入口结点。

复杂度分析

时间复杂度:O(N)。快慢指针相遇前,指针走的次数小于链表长度,快慢指针相遇后,两个index指针走的次数也小于链表长度,总体为走的次数小于 2n。

空间复杂度:O(1)。

注意点

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    // 快慢指针法
    ListNode *detectCycle(ListNode *head) {
        // 快慢双指针向后移动,当指针相同时相遇
        // 此时再从头和该点释放两个指针移动,相遇时的结点就是入口结点
        ListNode* slow = head;
        ListNode* fast = head;
		
        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next;	// 快指针步长2
            slow = slow->next;			// 慢指针步长1
            // 如果相遇,同时在表头、相遇点释放指针
            if(fast == slow){
                ListNode* index1 = fast;
                ListNode* index2 = head;
                while(index1 != index2){
                    index1 = index1->next;
                    index2 = index2->next;
                }
                return index1;
            }
        }
        
        return NULL;
    }
};

标签:60,结点,ListNode,cur,fast,next,链表,指针
From: https://www.cnblogs.com/tazdingo/p/17993328

相关文章

  • 链表操作
    代码随想录移除元素。不设置虚拟头节点,分类讨论。structListNode*removeElements(structListNode*head,intval){structListNode*temp;//当头结点存在并且头结点的值等于val时while(head&&head->val==val){temp=head;//将新的头结点设置为head->next并删......
  • 储迹NAS携3A6000新一代处理器参会龙芯重磅发布会
    11月28日,2023龙芯产品发布暨用户大会在国家会议中心如约启幕。大会以“到中流击水”为主题,现场发布新一代通用处理器龙芯3A6000。储迹作为龙芯的合作伙伴,携最新龙芯CPU3A6000到会议现场展示最新成果。龙芯3A6000处理器采用龙芯自主指令系统龙架构(LoongArch),是龙芯第四代微架构的首款......
  • 三级计算机网络大题60分——来自B站“吃饭不留名”(综合题4:sniffer抓包分析 10分)
    https://www.bilibili.com/video/BV1hE411x7RT?p=6&vd_source=2bddda168481f778f8f92561c7e55574方法技巧考点1考点2考点3考点4考点5考点6考点7考点8考点9考点9考点10考点11考点12考点13考点14考点15......
  • Day60 N种内部类
    N种内部类内部类就是在一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类相对B类来说就是外部类了。有以下这些:1.成员内部类2.静态内部类3.局部内部类4.匿名内部类1.成员内部类Inner类写在Outer类里面Inner即内部类Outer即外部类并且......
  • 143. 重排链表(中)
    目录题目题解:双指针+翻转链表题目给定一个单链表L的头节点head,单链表L表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。题解:双指针+翻转......
  • 142. 环形链表 II(中)
    目录题目题解:双指针题目给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索......
  • 三级计算机网络大题60分——来自B站“吃饭不留名”(综合题3:DHCP报文分析 10分)
    https://www.bilibili.com/video/BV1hE411x7RT?p=5&vd_source=2bddda168481f778f8f92561c7e55574考点1考点2(和考点3一起考察)考点3考点4知识总结真题演练1(考点1)真题演练2(考点2和考点3)真题演练3(考点2和考点3)真题演练4(考点4)......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节
    24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。题目链接:24.两两交换链表中的节点-力扣(LeetCode)建议画图,会更清晰一些。同时注意交换问题要用两个临时节点。class......
  • curl支持ssl报错:(60) SSL certificate problem: unable to get local issuer certific
     curl去访问https的站点报错:curl-vhttps://www.baidu.com*SSLv3,TLShandshake,Clienthello(1):*SSLv3,TLShandshake,Serverhello(2):*SSLv3,TLShandshake,CERT(11):*SSLv3,TLSalert,Serverhello(2):*SSLcertificateproblem:unabletogetl......
  • 三级计算机网络大题60分——来自B站“吃饭不留名”(综合题2:思科交换机配置 10分)
    https://www.bilibili.com/video/BV1hE411x7RT?p=4&spm_id_from=pageDriver&vd_source=2bddda168481f778f8f92561c7e55574真题演练1/40的几率......