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. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
需要画个图模拟一下过程
-
定义变量,整体过程共需要4个变量
-
当前节点,统一处理头结点和其他节点,初始值为新增一个哨兵节点,指向头结点,
-
临时节点1,用于保存两个节点后一个节点
-
临时节点2,用于保存两个节点的第一个节点
-
临时节点3,用于保存两个节点的第二个节点
-
-
开始遍历链表,两两交换必须要保证当前节点的后两个节点不能为null
-
给临时变量分别赋值
-
开始进行链表交换,三个步骤从前往后,分别拼凑交换后节点的指向
-
步骤一:当前节点指向临时节点2
-
步骤二:临时节点3指向临时节点2
-
步骤三:临时节点2指向临时节点1
-
-
当前节点移动到临时节点2,继续遍历交换链表
19.删除链表的倒数第N个节点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
思路:
定义两个指针,让快指针先移动n个节点,然后让另一个节点慢节点开始移动,直到第一个快指针指向null,此时慢指针就指向了倒数第n个元素:
比如:一个链表长10,求倒数第3个节点,快指针走到3,慢指针开始走,他们一块走7个长度,快指针指向null,慢指针差3个指向null,即为倒数第三个元素
由于,删除链表需要处理该节点的前一个节点,因此,让快指针走n+1个,走到终点,快慢指针差了n+1个长度(包括null的位置),慢指针就是指向倒数n+1个元素
-
定义快慢指针,初始都为哨兵节点,统一处理头结点和其他节点
-
遍历链表,快指针走到n+1的位置
-
快慢指针同时走,快指针为null,遍历链表
-
慢指针为倒数n+1个节点,指向倒数n-1的节点
160.链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
思路:
链表的相交理解为内存地址相同,而不是值相同,类比java内存结构,同一个value值在堆中有多个,当指向的是同一个地址的vaule为相同
因此,需要将两个链表尾部对齐,遍历比较
-
定义两个当前节点,分别指向两个链表的head遍历,求得两个链表的长度,将当前节点复原
-
默认B长于A,统一处理,当A长于B,处理交换两个链表,使得B仍然长于A
-
求长度差,让A节点,首先遍历到长度差处,此时两个链表尾部对齐
-
同时变量,比较两个链表对象,当相同时则返回