指定区间反转 LeetCode92
var reverseBetween = function(head, left, right) {
if(!head || left === right) return head;
let dummyHead = new ListNode(-1, head);
let cur = null;
let pre = dummyHead;
let tail = null;
let pos = 0;
while(pos < left - 1) {
pre = pre.next;
++pos;
}
tail = pre.next;
pos = left;
while(pos < right) {
cur = tail.next;
tail.next = cur.next;
cur.next = pre.next;
pre.next = cur;
++pos;
}
return dummyHead.next;
};
- 穿针引线法,切割反转区间,复用链表反转方法,最后拼接回原链表
两两交换链表节点 LeetCode24
var swapPairs = function(head) {
let dummyHead = new ListNode(-1, head);
let cur = dummyHead;
while(cur?.next?.next) {
let node1 = cur.next;
let node2 = cur.next.next;
node1.next = node2.next;
node2.next = cur.next;
cur.next = node2;
cur = node1;
}
return dummyHead.next;
};
两个链表相加 LeetCode445
var addTwoNumbers = function(l1, l2) {
let stack1 = new Array();
let p1 = l1;
let stack2 = new Array();
let p2 = l2;
while(p1 || p2) {
if(p1) {
stack1.push(p1.val);
p1 = p1.next;
}
if(p2) {
stack2.push(p2.val);
p2 = p2.next;
}
}
let dummyHead = new ListNode(-1,null);
let carry = 0;
while(stack1.length || stack2.length || carry) {
let a = 0;
let b = 0;
if(stack1.length > 0) a = stack1.pop();
if(stack2.length > 0) b = stack2.pop();
let add = a + b + carry;
carry = Math.floor(add);
add = add % 10;
let node = new ListNode(add);
node.next = dummyHead.next;
dummyHead.next = node;
}
return dummyHead.next;
};
var addTwoNumbers = function(l1, l2) {
let list1 = reverseList(l1), list2 = reverseList(l2);
let p1 = list1, p2 = list2;
let dummyHead = new ListNode();
let carry = 0;
while(p1 || p2 || carry) {
let a = 0, b = 0;
if(p1) {
a = p1.val;
p1 = p1.next;
}
if(p2) {
b = p2.val;
p2 = p2.next;
}
let add = a + b + carry;
carry = Math.floor(add / 10);
add = add % 10;
let node = new ListNode(add);
node.next = dummyHead.next;
dummyHead.next = node;
}
return dummyHead.next;
};
var reverseList = function(head) {
let dummyHead = new ListNode(-1);
let p = head;
while(p) {
let node = new ListNode(p.val);
node.next = dummyHead.next;
dummyHead.next = node;
p = p.next;
}
return dummyHead.next;
}
回文链表 LeetCode206
var isPalindrome = function(head) {
if(!head?.next) return true;
let slow = head;
let fast = head;
let pre = head;
let prepre = null;
while(fast?.next) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
pre.next = prepre;
prepre= pre;
}
if(fast) slow = slow.next;
while(slow) {
if(pre.val != slow.val) return false;
pre = pre.next;
slow = slow.next;
}
return true;
};