今日任务:
- 24.两两交换链表中的节点
- 看到以后浅试了一下,自己的思路都行不通,就直接看了代码随想录|24.两两交换链表中的节点思路讲解
- 需要明确两点
- 如何实现交换?实现交换一定是current指向要交换的两个节点的前一个节点
- 什么时候终止?
- 空链表:current.next === null
- 非空链表:
- 节点个数是奇数:current.next.next = null
- 节点个数是偶数:current.next = null
-
var swapPairs = function(head) { let headerNode = new ListNode(0, head) let currentNode = headerNode while(currentNode.next && currentNode.next.next){ let pre = currentNode.next let next2 = currentNode.next.next.next currentNode.next = currentNode.next.next currentNode.next.next = pre pre.next = next2 currentNode = pre } return headerNode.next };
- 19.删除链表的倒数第N个节点
- 自己的思路是:
- 先根据参数n找到倒数第n个节点current以及它的前一个节点pre,并保存下来
- 然后pre.next = current.next
- 随后拿着题目中给的实例模拟了一遍发现行不通,还是会漏掉情况
- 看了代码随想录|19.删除链表的倒数第N个节点讲解,用到了快慢指针,这是自己想不到的。
- 自己的思路是:
- 面试题02.07.链表相交
- 拿到题后自己的思路是:
- 倒着开始找,如果最后一个节点数值不相等,则返回null
- 当数值开始不相等的时候证明是分岔口
- 但是这样做很快就发现是不对的,没有理解相交的含义。
- 看了代码随想录|面试题02.07.链表相交的讲解后才知道,所谓的交点不是数值相等的节点,而是指针相等的节点
- 首先求出两个链表的长度
- 然后求出长度的差
- 最后末尾对齐,开始判断
- 下面是自己看了思路后写出来的代码,可以通过,但是不简洁。
-
function getLength (head){ let n = 0 let current = head while(head){ n++ current = head.next } return n } var getIntersectionNode = function(headA, headB) { let currentA = headA, currentB = headB let lengthA = getLength(headA) let lengthB = getLength(headB) let offSet = 0 if(lengthA != lengthB){ if(lengthA > lengthB){ offSet = lengthA - lengthB while(offSet -- > 0){ currentA = currentA.next } while(currentA && currentA !== currentB){ currentA = currentA.next currentB = currentB.next } return currentA }else{ offSet = lengthB - lengthA while(offSet -- > 0){ currentB = currentB.next } while(currentB && currentA !== currentB){ currentA = currentA.next currentB = currentB.next } return currentB } }else{ while(currentB && currentA !== currentB){ currentA = currentA.next currentB = currentB.next } return currentB } }
-
- 拿到题后自己的思路是:
- 142.环形链表Ⅱ
- 直接看的视频讲解代码随想录|142.环形链表Ⅱ|视频讲解讲的非常清晰!
-
var detectCycle = function(head) { let fast = head let slow = head while(fast && fast.next){ fast = fast.next.next slow = slow.next if(fast === slow){ let index1 = slow let index2 = head while(index1 != index2){ index1 = index1.next index2 = index2.next } return index1 } } return null };