反转链表
反转链表
两两交换
反转链表2
25. K 个一组翻转链表
var reverse=function(head,tail){let pre=tail.next,cur=head;//翻转,巩固反转链表这道题while(pre!==tail){let next=cur.next;cur.next=pre;pre=cur;cur=next;}return [tail,head]}var reverseKGroup = function(head, k) {let hair=new ListNode(null,head)let pre=hair;while(head){let tail=pre;//看剩余是否还有k个,拿到tailfor(let i =0;i<k;i++){tail=tail.next;if(!tail) return hair.next;}[head,tail]= reverse(head,tail)// 把子链表重新接回原链表pre.next=head;pre=tail;head=tail.next;}return hair.next;};
回文链表
//方法一 把原始链表反转存入一条新的链表,然后比较这两条链表是否相同var isPalindrome = function (head) {let pre = null,cur = head;while (cur) {let newNode = new ListNode(cur.val, pre);pre = newNode;cur = cur.next;}cur = head;while (pre) {if (pre.val !== cur.val) {return false;}pre = pre.next;cur = cur.next;}return true;};//方法二 利用后序遍历递归比较var isPalindrome = function (head) {let left = head;function tranverse(node) {if (node === null) return true;let res=tranverse(node.next);res = res && (node.val === left.val)left = left.next;return res;}return tranverse(head);};//方法三:快慢指针加反转链表 O(N) O(1)//Your runtime beats 98.5 % of javascript submissions//Your memory usage beats 96.07 % of javascript submissions (55.2 MB)var isPalindrome = function (head) {let slow = head,pre = null,fast = head;while (fast && fast.next) {fast = fast.next.next;//fast需要提前赋值,防止反转链表后找不到// 反转前半部分链表let next = slow.next;slow.next = pre;pre = slow;slow = next;}// 如果是奇数节点慢指针还得往后走一个if (fast) {slow = slow.next;}while (slow) {if (slow.val !== pre.val) return false;slow = slow.next;pre = pre.next;}return true;};
双指针
203. 移除链表元素
简单题,双指针
var removeElements = function(head, val) {let result=new ListNode(null,head);//虚拟节点,以防第一个节点被删除let pre=result,cur=head;while(cur){const next=cur.next;if(cur.val==val){pre.next=next;}else{pre=cur}cur=next;}return result.next;};
876. 链表的中间结点
使用快慢双指针
var middleNode = function(head) {let fast=slow=headwhile(fast!==null&&fast.next!==null){slow=slow.nextfast=fast.next.next}return slow};
237. 删除链表中的节点
用覆盖节点值的方式 代替 直接删除原节点。
var deleteNode = function (node) {let cur = node;while (cur && cur.next) {cur.val = cur.next.val;if (!cur.next.next) cur.next = null;cur = cur.next;}};
