代码随想录刷题总结--链表篇

203.移除链表元素:删除链表中等于给定值 val 的所有节点。

整体思路是需要将删除给定值的节点前一个节点,然后将前一个节点的next指向val的节点的下一个节点,因此需要先获取给定定值的前一个节点

1.需要new一个哨兵节点,因为当val元素时头结点的时候,获取不到前一个节点了,需要分情况考虑,使用哨兵节点可以统一处理

2.定义头结点head为当前节点,那么哨兵节点就为前一个节点

3.开始遍历链表,当链表的值时val的时候,让前一个节点的next指向当前节点的next,否则,前一个节点就等于当前节点,然后让当前节点等于next节点继续遍历

707.设计链表:

get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。 addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。 addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。 addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。 deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

 1.首先定义链表节点类,属性包括value值,和next指向的下一个链表节点类,然后是各种构造器
 2.定义列表方法类,需要新增一个head节点,为哨兵节点,和元素个数
 3.get方法:
     1.首先校验参数index
     2.定义当前节点为head节点(自己定义的哨兵节点),开始遍历链表
     3.遍历遍历到寻找的index下标停止,由于加了一个哨兵节点,需要遍历到index+1的位置返回目标节点的值
 4.add的方法可以抽取出来一个公共的方法,插入头部和尾部可以根据预先定义插入的相对位置,插入节点的原理也是需要找到插入位置的前一个节点,让前一个节点指向该节点,该节点指向的前一个节点的下一个节点
     1.首先校验参数,相对位置不能小于零和大于链表长度
     2.增加新节点之前需要将链表长度增加,然后定义前一个节点变量为head节点(自己定义的哨兵节点),开始遍历链表,和get方法不同的,需要找到前一个节点,因此遍历到目标的位置index
     3.new一个待插入的链表节点,根据获取到前一个节点进行插入操作
 5.delete方法,和add方法类似,需要找到前一个节点,将前一个节点指向前一个节点的后两个节点,即跳过目标位置的节点

206.反转链表

首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。 然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。

双指针法 有点像冒泡排序,两两操作交换,同时需要一个中间值存储

1.首先定义需要的变量参数,前一个节点变量,定义为null,这个理解为最后一个节点的指向;当前节点,定位为头结点,主要是操作当前节点和前一个节点的交换;临时节点,为当前节点的下一个节点,为了继续往后遍历后续节点,

2.开始遍历链表,只要当前节点不为空,操作当前节点指向前一个节点,前一个节点则等于当前节点,然后将当前节点定义为临时节点保存的下一个节点

3.需要注意循环赋值的顺序

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

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

需要画个图模拟一下过程

  1. 定义变量,整体过程共需要4个变量

    1. 当前节点,统一处理头结点和其他节点,初始值为新增一个哨兵节点,指向头结点,

    2. 临时节点1,用于保存两个节点后一个节点

    3. 临时节点2,用于保存两个节点的第一个节点

    4. 临时节点3,用于保存两个节点的第二个节点

  2. 开始遍历链表,两两交换必须要保证当前节点的后两个节点不能为null

  3. 给临时变量分别赋值

  4. 开始进行链表交换,三个步骤从前往后,分别拼凑交换后节点的指向

    1. 步骤一:当前节点指向临时节点2

    2. 步骤二:临时节点3指向临时节点2

    3. 步骤三:临时节点2指向临时节点1

  5. 当前节点移动到临时节点2,继续遍历交换链表

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

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

思路:

定义两个指针,让快指针先移动n个节点,然后让另一个节点慢节点开始移动,直到第一个快指针指向null,此时慢指针就指向了倒数第n个元素:

比如:一个链表长10,求倒数第3个节点,快指针走到3,慢指针开始走,他们一块走7个长度,快指针指向null,慢指针差3个指向null,即为倒数第三个元素

由于,删除链表需要处理该节点的前一个节点,因此,让快指针走n+1个,走到终点,快慢指针差了n+1个长度(包括null的位置),慢指针就是指向倒数n+1个元素

  1. 定义快慢指针,初始都为哨兵节点,统一处理头结点和其他节点

  2. 遍历链表,快指针走到n+1的位置

  3. 快慢指针同时走,快指针为null,遍历链表

  4. 慢指针为倒数n+1个节点,指向倒数n-1的节点

160.链表相交

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

思路:

链表的相交理解为内存地址相同,而不是值相同,类比java内存结构,同一个value值在堆中有多个,当指向的是同一个地址的vaule为相同

因此,需要将两个链表尾部对齐,遍历比较

  1. 定义两个当前节点,分别指向两个链表的head遍历,求得两个链表的长度,将当前节点复原

  2. 默认B长于A,统一处理,当A长于B,处理交换两个链表,使得B仍然长于A

  3. 求长度差,让A节点,首先遍历到长度差处,此时两个链表尾部对齐

  4. 同时变量,比较两个链表对象,当相同时则返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值