functionDoubleNode(value,last,next){ this.value = value this.last = last this.next = next }
let n1 = newDoubleNode(1,null) n1.next = newDoubleNode(2,n1) n1.next.next = newDoubleNode(3,n1.next)
functionreverseDouble(head){ let pre = null let next = null while (head){ next = head.next head.next = pre head.last = next pre = head head = next } return pre }
var reverseKGroup = function(head, k) { let start = head let end = getGroupEnd(start,k) if(!end){ return start } head = end reverse(start,end) let lastEnd = start while(start.next){ start = start.next end = getGroupEnd(start,k) if(!end){ return head } reverse(start,end) lastEnd.next = end lastEnd = start } return head };
functionreverse(start,end){ let cur = start let pre = null let next = null while(start !== end){ next = start.next start.next = pre pre = start start = next } next = start.next start.next = pre cur.next = next }
var isPalindrome = function(head) { if(!head || !head.next) returntrue let fast = head let slow = head const stack = [] while(fast && fast.next){ stack.push(slow.val) fast = fast.next.next slow = slow.next } if(fast) slow = slow.next while(slow){ if(stack.pop() !== slow.val) returnfalse slow = slow.next } returntrue };
继续优化:只使用O(1)的额外空间复杂度,慢指针在走的过程中将前半部分的链表反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
var isPalindrome = function(head) { if(!head || !head.next) returntrue let fast = head,slow = head,cur = head let pre = null while(fast && fast.next){ fast = fast.next.next slow = slow.next cur.next = pre pre = cur cur = slow } if(fast) slow = slow.next while(slow){ if(slow.val !== pre.val) returnfalse slow = slow.next pre = pre.next } returntrue };