首页 > 其他分享 >代码随想录day4链表2

代码随想录day4链表2

时间:2023-12-01 21:35:24浏览次数:40  
标签:ListNode day4 aDummyHead 随想录 fast next 链表 节点

day4 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

资料来源:代码随想录 (programmercarl.com)

5.两两交换链表中的节点

class Solution
{
private:
    /* data */
public:
    Solution(/* args */);
    ~Solution();
    struct ListNode
    {
        /* data */
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };


};

6.删除链表的倒数第N个节点,双指针法

    // 6. 删除链表的倒数第N个节点,双指针法
    ListNode *deleteTailN(ListNode *head, int index)
    {
        ListNode *fast = head;
        ListNode *slow = head;
        int n = index;
        while (n-- && fast != NULL)
        { // 忘记考虑链表不够长的情况
            fast = fast->next;
        }

        fast = fast->next; // !!!!!! fast再提前走一步,因为需要让slow指向删除节点的上一个节点
        while (fast != NULL)//判断的是fast如果不多走一步,slow会多走一步
        {
            fast = fast->next;
            slow = slow->next;
        }
        ListNode *tmp = slow->next;
        slow->next = slow->next->next;
        delete tmp;

        return _dummyHead->next;
    }

7.链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

/**
 * @file t7.h
 * @author nrt ([email protected])
 * @brief 07. 链表相交
 * @version 0.1
 * @date 2023-12-01
 *
 * @copyright Copyright (c) 2023
 *
 */
#include <iostream>

using namespace std;

class Solution
{
public:
    struct ListNode
    {
        /* data */
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };
    // 初始化链表
    Solution()
    {
        _dummyHead = new ListNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
        _size = 0;
    };
    ~Solution();

    ListNode *_dummyHead;
    int _size;

    // 7.链表相交
    /**
     * @brief Get the Intersection Node object
     *          思路:求链表长度差值,如果相交的话,肯定是最后一段从某个结点开始,地址相同,
     *                  先求出差值,然后,长的先走差值个数,再一起走,比较结点地址
     * @param headA
     * @param headB
     * @return ListNode*
     */

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
    {
        ListNode *aDummyHead = headA;
        ListNode *bDummyHead = headB;
        int aSize = 0;
        int bSize = 0;

        while (aDummyHead != NULL)
        {
            aDummyHead = aDummyHead->next;
            aSize++;
        }
        while (bDummyHead != NULL)
        {
            bDummyHead = bDummyHead->next;
            bSize++;
        }
        // 置到表头
        aDummyHead = headA;
        bDummyHead = headB;
        int cSize = 0;
        // 使得A为长链,减少代码量
        if (bSize > aSize)
        {
            swap(aSize, bSize);
            swap(aDummyHead, bDummyHead);
        }
        cSize = aSize - bSize;

        // A链先走cSize长度
        while (cSize--)
        {
            aDummyHead = aDummyHead->next;
        }
        // 开始比较A,B链的结点
        while (aDummyHead != NULL)
        {
            if (aDummyHead == bDummyHead)
            {
                return aDummyHead;
            }
            aDummyHead = aDummyHead->next;
            bDummyHead = bDummyHead->next; // 位移
        }
        return NULL;
    }
};

8.环形链表

数学得出的结论很精彩:从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点

    // 8. 环形链表II:给定一个链表,返回链表开始入环的第一个节点。 
	//    如果链表无环,则返回 null。
    /**
     * @brief 
     *思路:
     *1.快慢指针法判断是否有环,快指针步长2,慢指针步长1,如果有环的话
     * ,就像操场跑步,都会相遇的
     *2.从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点,
     * 那么当这两个指针相遇的时候就是 环形入口的节点**。
     *
     * @param head
     * @return ListNode*
     */

    ListNode *detectCycle(ListNode *head)
    {
        ListNode *fast = head;
        ListNode *slow = head;
        while (fast != NULL && fast->next != NULL)
        {
            slow = slow->next;
            fast = fast->next->next;
            // 如果有环,找到入口
            if (fast == slow)//1.
            {
                ListNode *index1 = fast;
                ListNode *index2 = head;//2.
                while (index1 != index2)
                {
                    index1 = fast->next;
                    index2 = head->next;
                    
                }
                return index1;
            }
        }
        return NULL;
    }

总结:

主要还是要搞清楚逻辑,知道现在操作的是链表的第几个指针

image-20231201205510416

这个图是 代码随想录知识星球 (opens new window)成员:海螺人 (opens new window),所画,总结的非常好,分享给大家。

标签:ListNode,day4,aDummyHead,随想录,fast,next,链表,节点
From: https://www.cnblogs.com/nrtnrt/p/17870897.html

相关文章

  • 代码随想录day3链表1
    链表理论基础203.移除链表元素707.设计链表206.反转链表资料来源:代码随想录(programmercarl.com)1链表理论基础定义:是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。......
  • 82. 删除排序链表中的重复元素 II
    82.删除排序链表中的重复元素II2021年3月25日​数据量300,数据大小[-200,200]​题意很简单,就考验你指针的使用。​两种方法桶排序暴力法思路很简单,加个100的偏移量,然后全都存下来,再倒着存进链表里返回即可。classSolution{public:ListNode*deleteDuplicates(......
  • 83. 删除排序链表中的重复元素
    83.删除排序链表中的重复元素2021年3月26日删除排序链表中的重复元素II的简化版,while套while就行为了时间,指针都不删除吗?classSolution{public:ListNode*deleteDuplicates(ListNode*head){ListNode*p=head;while(p&&p->next){w......
  • 61. 旋转链表
    61.旋转链表2021年3月27日将链表每个节点向右移动\(k\)个位置首先,假设链表长度为\(len\)当\(k<len\)时,相当于后\(k\)位移到前面当\(k>len\)时,令\(k\%=len\),然后再移动即可classSolution{public:ListNode*rotateRight(ListNode*head,intk){if(he......
  • 代码随想录day2
    977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II,总结1有序数组的平方​ 给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。2长度最小的子数组给定一个含有n个正整数的数组和一个正整数s,找出该数组中满......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    LeetCode704二分查找题目链接:LeetCode704左闭右闭:视频讲解:手把手带你撕出正确的二分法思路:在循环条件中注明left<=right,即[left,right]classSolution{public:intsearch(vector<int>&nums,inttarget){intleft=0,right=nums.size()-1......
  • 19.删除链表的倒数第N个节点
    leetcode题目链接题目描述给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:输入:head=[1,2],n=1输出:[1]提示:链表中结点的数目为sz1<=sz<=300<=Node.val<=10......
  • 拉链表学习
    拉链表介绍:记录历史。记录一个事务从开始,一直到当前状态的所有变化的信息。业务场景表中的部分字段会被更新。需要查看某一个时间点或者时间段的历史快照信息。表中的记录变化的比例和频率不是很大。具体案例......
  • 刷题复习(一)链表-双指针
    刷题复习(一)链表-双指针https://labuladong.gitee.io/algo/di-ling-zh-bfe1b/shuang-zhi-0f7cc/1、合并两个有序链表思路清晰,双链表有个根节点记录开头/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}......
  • 代码随想录-哈希
    242.有效的字母异位词https://leetcode.cn/problems/valid-anagram/description/classSolution{public:boolisAnagram(strings,stringt){if(s.size()!=t.size())returnfalse;inthash[26]={0};for(inti=0;i<s.size......