leetcode总结无止境系列之链表

链表是面试中十分容易考到的题目,一般代码比较短,而且考查面试者的思维全面性和写无bug代码的能力。在写链表的题目时,建议画出示意图,并把头结点、尾节点这些特殊的结点考虑在内。
主要的技巧就是要用dummy head,就是在链表头加一个节点指向head,这样可以避免判断头指针,统一处理所有情况,最后返回dummy->next;另外有一个跟dummy head等价的方法是用指针的指针**p去处理,也能达到dummy head的效果,比dummy好的地方是,不用delete dummy head,另外如果一个节点比较大的话,用**p也比较省空间,但是逻辑上比dummy要绕一点.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
//dummy head的使用示例
ListNode* ProcessList(ListNode* head){
    ListNode* dummy = new ListNode();
    dummy->next = head;
    //process the list
    head = dummy->next;
    delete dummy;//再提醒一次,请记得delete
    return head;
}
//指针的指针用法示例
ListNode* ProcessList(ListNode* head){
    ListNode** pNode = &head;
    //process the list
    //每次将处理得到的pCur连到新链表pNode上
    return head;
}

链表常考题

题一、 给定单链表,检测是否有环。
思路:(快慢指针)使用两个指针p1,p2从链表头开始遍历,p1每次前进一步,p2每次前进两步。如果p2到达链表尾部,说明无环,否则p1、p2必然会在某个时刻相遇(p1==p2),从而检测到链表中有环。

题二、 给定两个单链表(head1, head2),检测两个链表是否有交点,如果有返回第一个交点。
思路:(两个单链表相交只可能为“X”型,因为单链表只有一个next指针)如果head1==head2,那么显然相交,直接返回head1。否则,分别从head1,head2开始遍历两个链表获得其长度len1与len2。假设len1>=len2,那么指针p1由head1开始向后 移动len1-len2步。指针p2=head2,下面p1、p2每次向后前进一步并比较p1p2是否相等,如果相等即返回该结点,否则说明两个链表没有 交点。

题三、 给定单链表(head),如果有环的话请返回从头结点进入环的第一个节点。
思路:运用题一,我们可以检查链表中是否有环。如果有环,那么p1p2重合点p必然在环中。从p点断开环,方法为:p1=p, p2=p->next, p->next=NULL。此时,原单链表可以看作两条单链表,一条从head开始,另一条从p2开始,于是运用题二的方法,我们找到它们的第一个 交点即为所求。

题四、只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点。
思路:办法很简单,首先是放p中数据,然后将p->next的数据copy入p中,接下来删除p->next即可。

题五、只给定单链表中某个结点p(非空结点),在p前面插入一个结点。
思路:办法与前者类似,首先分配一个结点q,将q插入在p后,接下来将p中的数据copy入q中,然后再将要插入的数据记录在p中。

题六、给定单链表头结点,删除链表中倒数第k个结点。
思路:使用两个节点p1,p2,p1初始化指向头结点,p2一直指向p1后第k个节点,两个结点平行向后移动直到p2到达链表尾部(NULL),然后根据p1删除对应结点。

题七 复杂链表复制
思路:复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。第一步根据原始链表的每个结点N,创建对应的N’,把N’链接在N的后面;第二步是设置复制出来的链表上的结点的m_pSibling;第三步是把这个长链表拆分成两个:把奇数位置的结点链接起来就是原始链表,把偶数位置的结点链接出来就是复制出来的链表。

题八 两个不交叉的有序链表的合并
思路:主要考察了merge的过程,和链表的操作,在leetcode总结无止境系列之排序中有相关例题

题九 链表翻转(包括全翻转,部分翻转,分段翻转)(递归或非递归实现)
思路:翻转过程一般需要三个结点指针:尾结点subTail(初始为待翻转序列的头结点,一步步翻转后最后成为新序列的尾结点)、待翻转结点pCur(其实就是尾结点的next结点)、头结点(每次翻转都需要更新)。具体也见下面的leetcode例题:Reverse Nodes in k-Group、Reverse Linked List II

题十 实现链表排序的一种算法
思路:链表排序可用:归并、插入、冒泡及选择(单向链表);归并、快排、插入、冒泡及选择(双向链表);优先考虑归并,时间复杂度低,实现简单。

题十一 删除有序单链表中重复的元素
思路:删除重复主要有两种思路:一是考虑复制有用结点的value值,覆盖掉需删除的结点;二是直接操作链表删除或者借助栈或set之类的容器来重组。

题十二 用链表模拟大整数加法运算
思路:要注意对进位的全面考虑

leetcode 上相关题目汇总

1.Add Two Numbers

2.Swap Nodes in Pairs

3.Partition List

4.Remove Duplicates from Sorted List

5.Remove Duplicates from Sorted List II

6.Remove Nth Node From End of List

7.Reverse Linked List II

8.Reverse Nodes in k-Group

This entry was posted in  INTERVIEW,  STUDY and tagged  data structure,  leetcode by  missjing. Bookmark the  permalink.

leetcode总结无止境系列之链表相关推荐

  1. Leetcode 系列 | 反转链表

    点击上方"算法猿的成长",选择"加为星标" 第一时间关注 AI 和 Python 知识 最近会更新一个 leetcode 的刷题系列,每次更新一道题目,并且通过 ...

  2. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  3. narwal无法连接机器人_懒无止境 能自己洗抹布的云鲸J1扫拖机器人

    0.篇首语 如果让我总结过去的2019年又哪几样产品,显著的提升了我的幸福感让生活变得更加方便,那么智能指纹锁和扫地机器人一定可以排在最前面. 指纹锁其实不用多说出门无需担心没带钥匙,抬手就能开门的流 ...

  4. python leetcode_七十五、Python | Leetcode哈希表系列

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  5. 社区圆桌分享:代码学习无止境,程序员如何规划自己的职业生涯发展?

    CloudWeGo Study Group 是由 CloudWeGo 社区发起的学习小组,开展以 30 天为一期的源码解读和学习活动,帮助新成员融入社区圈子,和社区 Committer 互动交流,并学 ...

  6. 告别无止境的增删改查:Java代码生成器

    对于一个比较大的业务系统,我们总是无止境的增加,删除,修改,粘贴,复制,想想总让人产生一种抗拒的心里.那有什么办法可以在正常的开发进度下自动生成一些类,配置文件,或者接口呢? 有感于马上要做个比较大的 ...

  7. 美国科学院报告《无止境的前沿:科学的未来75年》

    来源:科技咨询频道 作者:刘昊 张志强 曹玲静 编译:刘昊 张志强 曹玲静 (中国科学院成都文献情报中心) 2020年12月17日,美国国家科学院出版报告<无止境的前沿--科学的未来75年> ...

  8. 七十五、Python | Leetcode哈希表系列

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  9. linux 用mutex定义一个linkedlist,一个高性能无锁非阻塞链表队列

    这个是一个用c++ 11标准实现的无锁非阻塞链表队列,通过增加一个dummy节点,解偶合链表头指针和尾指针.使得当只有一个生产者和一个消费者时,进队和出队都无需加锁,进队操作的是尾指针,出队操作的是头 ...

  10. LeetCode (合集)合并链表和数组

    LeetCode 88. 合并两个有序数组 golang LeetCode 21. 合并两个有序链表 golang 合并两个有序链表并去重 /*** Definition for singly-lin ...

最新文章

  1. php session域名共享,实现多域名下共用一个SESSION
  2. Sourceforge.net速度快的镜像 [zt]
  3. c odac 连接 oracle,使用ODAC112040Xcopy_64bit 将sql server连接到oracle
  4. C++二进制文件读写操作
  5. boost::phoenix::bind相关的测试程序
  6. Qt工作笔记-把QTableWidget数据存为XML,启动时加载XML
  7. QComboBox列表项高度设置
  8. 使用半透明的DIV实现禁用页面功能
  9. 控制系统设计专题(一)——PID控制算法
  10. 华为光猫虚拟服务器怎么设置,华为路由器连接光猫怎么设置
  11. 离散求边缘密度_求一把能退烧的机械键盘?——机械键盘购买“指北”
  12. 函数c语言如何传参数,C语言函数参数传递规律
  13. 毕业论文致谢(转自上交硕士论文)
  14. 德尔菲法 Delphi 专家判断
  15. ecshop的dwt模板文件
  16. ccf 智能运维 裴丹_智能运维是什么?
  17. 安卓期末大作业——售票APP源码和设计报告
  18. Vlan总结(Chinaitlab教程)
  19. XM外汇是什么平台?可以交易哪些产品?
  20. 是什么让区块链游戏变的“好玩”

热门文章

  1. 数据预处理阶段“不处理”缺失值的思路
  2. c语言密文加密解密问题注释,c语言通过openssl aes对称加解密和base64编解码将密码存储成密文...
  3. 疫情防控加速数字化,亚洲普惠金融迎来大发展
  4. 小米路由器装linux,小米路由器3安装Misstar 从开始到失败
  5. 数智化升级:红蜻蜓的转型之路(上)
  6. 正则表达式测试工具 java,正则表达式测试工具RegexTester
  7. C# winfrom 在button按钮上显示箭头
  8. Linux 下检测是否插入U盘
  9. android如何使用so库,Android 使用SO库
  10. turtle递归作图绘制谢尔宾斯基地毯【详解】