IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单链表 链表的快慢指针 经典例题 -> 正文阅读

[数据结构与算法]单链表 链表的快慢指针 经典例题

这周末爽刷力扣,写个博客回顾一下。

?之前很不适应力扣写函数的模式,不过好像写两道就习惯了。

707 设计链表?力扣

没什么可说的基础题,要注意的是链表是有头节点的。

------------------------------------------------------------------------

141 环形链表?力扣

这题就是快慢指针的应用了,当链表有环的时候,快指针一定可以追上慢指针。无环时,快指针会先到达链表尾部。

----------------------------------------------------------------------------

142 环形链表?力扣

也是快慢指针,由于要返回链表开始入环的第一个节点,所以稍微复杂一点,我们设未成环的节点长度为a,环节点的长度为b,这样当快指针追上慢指针时,我们设慢指针走了s,这样就是2s=s+nb,n是大于等于1的整数。于是就有s=nb,又因为a+nb还是入环的第一个节点,也就是说慢指针再走a就到达了入环的第一个节点,所以我们可以再加一个指针或者直接把快指针重新指向头节点,速度置为一,这样当他们再次相遇的时候一定位于入环的第一个节点。

------------------------------------------------------------------------------

160 相交链表?力扣

这题就是双指针,分别指向两个链表的头节点,当他们走到空指针时,分别置为另一个链表的头节点,当它们相等时返回其中一个即可。

这个可以想象为两个人,他们的速度的相同,并且由于链表相交,他们的起点可以视为相同,那么他们相遇的终点一定位于链表的相交点。想不通的话反过来想一想。如果链表不相交,那么他们最后相等的时候一定同时等于空指针。

(btw,颇有感触,当两个人走过完全相同的一段路,那么他们算不算、会不会相遇呢,如果他们还没有相遇,那么是不是注定不会相遇呢。)

-----------------------------------------------------------------------------

19 删除链表的倒数第N个节点??力扣

这题没什么难度,可以自己写一个函数用于获取链表的长度,然后对于头节点不好处理的情况,可以再头节点前面加上一个哑节点(只有指针域),这样的话对于这个新链表,原来的头节点就变成了一个普通的节点了。

-----------------------------------------------------------------------------------

2022/9/25

该睡觉了,就先写这么多了,明天接着写。

-----------------------------------------------------------------------------------------------------

206 反转链表?力扣

这题的话画图比较明白,感觉链表的题画图的话思路很清晰。

定义三个指针 cur,pre,end 名字也没什么特殊的意义。

cur指向当前待反转的节点

pre指向cur的下一个节点,用于保存。

end指向反转后的链表的头节点。

那么

while(cur!=NULL)
{
    pre=cur->next;  //保存原始链表
    cur->next=end;  //断开连接,建立新的连接
    end=cur;   //移位操作,让end指向反转后链表的新的头节点
    cur=pre;  //cur指向下一个待反转的节点
}

最后返回end指针即可。

-----------------------------------------------------------------------------

203 移除链表元素?力扣

同样的思路,为了把头节点变得普通,新建了一个哑节点。

在遍历链表的时候,当遇到要删除的点时,应当删除,但不需要移动,应当是出现下一个不需要删除的数的时候,移动指针。可以避免出现连续需要删除节点出错的问题。

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode *cur=(struct ListNode *)malloc(sizeof(struct ListNode));
    cur->next=head;
    struct ListNode *temp=cur;
    while(cur->next)
    {
        if(cur->next->val != val)
        {
            cur=cur->next;
        }
        else
        {
            cur->next =cur->next->next;
        }
    }
    return temp->next;
}

-----------------------------------------------------------------------------

328 奇偶链表?力扣

这题就是通过遍历链表,把链表分开为奇数链表和偶数链表,然后让奇数链表的尾节点连上偶数链表的头节点即可。

struct ListNode* oddEvenList(struct ListNode* head){
    if(head == NULL || head->next == NULL) 
        return head;
    struct ListNode *odd =head;
    struct ListNode *even=head->next;
    struct ListNode *evenhead=even;
    while(even != NULL && even->next != NULL)//由于偶节点一定在奇数节点后面所以循环条件是这样
    {
        even=odd->next;
        odd->next = even->next;
        even->next =odd->next->next;
        odd=odd->next;
        even=even->next;
    }
    odd->next=evenhead;
    return head;
}

------------------------------------------------------------------------------

234 回文链表?力扣

这题我觉得好难,我觉得回文都挺难的。

由于是回文,那么我们会想到,用递归遍历到最后一个节点再回溯来实现反向遍历的思路。

但是还是有别的地方不好想。

struct ListNode *pre;

bool dfs(struct ListNode *cur)
{
    if(cur != NULL)
    {
        if(!dfs(cur->next))//这一步是很巧妙的,既是递归又是出口,出口指的是一旦出现return false的情况那么就会一层层的向上return false,而第一次出现false的情况只能是出现了不匹配的情况                                               
        {
            return false;
        }
        if(cur->val != pre->val)
        {
            return false;
        }
        pre=pre->next;//比较下一个
    }
    return true;
}

bool isPalindrome(struct ListNode* head){
    pre=head;
    return dfs(head);
}

其实这种递归的做法还是有浪费的地方,也就是链表前半部分会重复比较一次。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:12:58  更:2022-09-30 01:18:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:53:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码