leetcode 206、203、328、234链表经典题
技巧
1. 通过一些测试用例可以节省您的时间。
使用链表时不易调试。因此,在编写代码之前,自己尝试几个不同的示例来验证您的算法总是很有用的。
2. 你可以同时使用多个指针。
有时,当你为链表问题设计算法时,可能需要同时跟踪多个结点。您应该记住需要跟踪哪些结点,并且可以自由地使用几个不同的结点指针来同时跟踪这些结点。
如果你使用多个指针,最好为它们指定适当的名称,以防将来必须调试或检查代码。
3. 在许多情况下,你需要跟踪当前结点的前一个结点。
你无法追溯单链表中的前一个结点。因此,您不仅要存储当前结点,还要存储前一个结点。这在双链表中是不同的
206. 反转链表
var reverseList = function(head) { let prev = null; let cur = head; while(cur){ let temp = cur.next; cur.next = prev; prev = cur; cur = temp; } return prev; };
203. 移除链表元素
var removeElements = function(head, val) { const dummyhead = new ListNode(0, head); let cur = dummyhead; while(cur.next) { if(cur.next.val === val) { cur.next = cur.next.next; continue; } cur = cur.next; } return dummyhead.next; };
328. 奇偶链表
var oddEvenList = function(head) { if(!head) return head; let odd = head;// 扫描奇数结点 let even = head.next;// 扫描偶数结点 let evenHead = even;// 保存偶链的头结点 while(even != null && even.next != null){ odd.next = even.next;// even.next是下一个奇数结点 odd = odd.next;// odd 推进到下一个奇数结点\ even.next = odd.next;// 下一个奇数结点的next是下一个偶数结点 even = even.next;// even 推进到下一个偶数结点 } odd.next = evenHead;// 奇链连上偶链 return head; };
234. 回文链表
var isPalindrome = function(head) { if(!head || !head.next) return true; let fast = head, slow = head; let prev; while(fast && fast.next){ prev = slow; slow = slow.next; fast = fast.next.next; } prev.next = null;// 断成两个链表 // 翻转后半段 let head2 = null; while(slow){ const temp = slow.next; slow.next = head2; head2 = slow; slow = temp; } // 比对 while(head && head2){ if(head.val != head2.val){ return false; } head = head.next; head2 = head2.next; } return true; };