仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
206.反转链表
提供参数:链表头head
思路:改变指针的指向->将整条链的反转分解为重复的调整指针方向的操作
主要操作:
定义pre,cur指针,初始化pre指向null,cur指向head
进行以下重复操作直到结束:
1.保存cur指针的下一个节点,避免丢失
2.cur指向pre所指节点
3.pre指向cur所指节点
4.cur指向原来cur所指的下一个节点
最后cur指向初始串的null节点,而pre指向新串的头节点
使用双指针的方式避免的创建新链表开辟的额外内存
24. 两两交换链表中的节点
提供参数:链表头head
思路:和206思路一样,正常模拟链表操作->将对整条链的操作分解为对局部的重复操作
主要操作:
创建虚节点(无有效数据的指向头节点的节点)(不需要特别处理头节点)
定义cur指针指向虚节点(cur指针总指向需要交换的两个节点的前一个节点)
重复操作:
(假设当前局部为:cur->1->2->3)
1.临时保存原链表中cur的后一个和后第三个节点(保存1,3节点)
2.cur指向2节点(这时1节点丢失,但已经临时保存了)
3.通过临时节点,使节点2指向节点1(这时3节点丢失,但已经临时保存了)
4.通过临时节点,使节点1指向节点3
(此时局部链表为:cur->2->1->3)
5.将cur指向后两个节点(此为1)(即指向将要交换的两个节点的前一个节点)
通过改变指针的指向来交换,不需要额外耗费过多的内存空间
19.删除链表的倒数第N个节点
提供参数:链表头head,整数n(倒数第n个)
思路:使用双指针法
主要操作:
定义fast,slow两指针
fast向前移动(n+1)个节点(移动n个节点,后续移动slow将移动到需删除节点上,移动n+
1个节点,slow将移动到需删除节点前一个节点上)
fast与slow同时移动直到fast移动到链表尾null节点(此时slow指向需删除节点前一个节点)
链表的删除节点操作
160.链表相交
提供参数:链表头headA,链表头headB
关键:若两链表相交,则相交后所有节点必定相同(节点数量也相同)
主要操作:
1.遍历两链表,得到两链表长度lenA,lenB
2.若B链比A链长,则交换两链和链长度(保证A链比B链长,方便后续统一操作,
不需要分 A 链长还是B链长)
3.定义两指针curA和curB指向headA和headB
4.curA移动(lenA-lenB)个节点(相交后所有节点必定相同,节点数量也相同)
5.curA与curB比较是否为同一节点,是则返回,不是则向后移动,直到指向null,返回不相交
142.环形链表II
提供参数:链表头head
关键:
判断是否有环:
2个指针:fast指针每次走两格,slow指针每次走一格
若有环则两指针必定在某一时刻指向同一节点
有环,寻找入环节点:
3个节点:头节点a,入环节点b,相遇节点c
3段距离:a到b距离x,b到c距离y,c通过环到b距离z
以下等式成立:
相遇时: slow指针走过的节点数为: x + y
, fast指针走过的节点数:x + y + n (y + z)
(n为相遇时fast走过的圈数,y+z就是一圈的距离)
(x + y) * 2 = x + y + n (y + z) (fast每次走两格,slow每次走一格)
化简得到:x = (n - 1) (y + z) + z
即从头节点到入环节点的距离为相遇节点到入环节点的距离加上任意圈环的距离
所以可使用两个指针cur1和cur2,分别从head和相遇节点开始一起向后走,当两指针指向同一节点时就是入环节点