DAY04 链表part02

82 阅读3分钟

第二章 链表part02

今日任务

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

详细布置

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

用虚拟头结点,这样会方便很多。

本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。

题目链接/文章讲解/视频讲解: programmercarl.com/0024.%E4%B8…

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

双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。

题目链接/文章讲解/视频讲解:programmercarl.com/0019.%E5%88…

面试题 02.07. 链表相交

本题没有视频讲解,大家注意 数值相同,不代表指针相同。

题目链接/文章讲解:programmercarl.com/%E9%9D%A2%E…

142.环形链表II

算是链表比较有难度的题目,需要多花点时间理解 确定环和找环入口,建议先看视频。

题目链接/文章讲解/视频讲解:programmercarl.com/0142.%E7%8E…

总结

对于链表的题目,大家最大的困惑可能就是 什么使用用虚拟头结点,什么时候不用虚拟头结点? 一般涉及到 增删改操作,用虚拟头结点都会方便很多, 如果只能查的话,用不用虚拟头结点都差不多。

当然大家也可以为了方便记忆,统一都用虚拟头结点。

www.programmercarl.com/%E9%93%BE%E…

笔记

两两交换链表中的节点

  • 使用虚拟头节点
  • 指针指向虚拟头节点(即要操作的两两节点的前一个节点)
  • 明确循环的终止条件为当前指针的下一个节点以及下下个节点为空
  • 用临时变量temp1存储当前指针节点的下一个节点
  • 用临时变量temp2存储当前指针节点的下下下个节点
  • 开始交换
  • 当前指针的下个节点指向当前指针的下下个节点
  • 当前指针的下下个节点指向temp1
  • temp1的下个节点指向temp2
  • 将当前指针往后移动两位,即cur=cur.next.next
  • 循环体外返回dummy.next

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

  • 使用虚拟头节点;
  • 定义两个指针,一快一慢,初始指向虚拟头节点;
  • 先让fast走n步(while(n--) fast=fast.next);
  • 此时同时移动fast和slow(循环推出条件为fast.next===null);
  • 此时的slow就是倒数第n+1个节点
  • 删除倒数第n个节点
  • 返回dummy.next

链表相交

  • 两个指针p A,pB分别指向两个链表的头部;
  • 不断向后移动各自的指针;
  • 当某一个指针移动到了该链表的尾部(即null)则立即将该指针指向另一条链表的头部
  • 不断循环,直到pA===pB时退出;
  • 此时pA或者pB就是要找的交点

环形链表2