反转链表Ⅰ 剑指offer 24
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
来源:力扣(LeetCode) 著作权归领扣网络所有。
1. 双指针Ⅰ
每两位交换位置。
pre指针用来存储下一个节点。
cur | | pre
null → 1 → 2 → 3 → 4 → 5 → nullnull ← 1 2 → 3 → 4 → 5 → null
var reverseList = function(head) {
let cur = null;
let pre = head;
while(pre!=null){
let tmp = pre.next; //临时存储pre.next,以便后续pre指针右移
pre.next = cur; //cur节点与pre节点反指
cur = pre; //pre和cur指针右移
pre = tmp;
}
return cur;
};
反转链表Ⅱ leetcode92
给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置
right 的链表节点,返回 反转后的链表 。示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
//反转链表Ⅰ
const reverseList =(head) =>{
let cur = null;
let pre = head;
while(pre!=null){
let tmp = pre.next;
pre.next = cur;
cur = pre;
pre = tmp;
}
};
var reverseBetween = function(head, left, right) {
//dummyNode 规避head分情况讨论
let dummyNode = new ListNode(-1);
dummyNode.next = head;
let pre = dummyNode; //left节点前面的一个节点
let suc; //right后面一个节点
let leftNode, rightNode;
//寻找left节点和pre节点
for(let i = 0;i<left-1;i++){
pre = pre.next;
}
leftNode = pre.next;
//从pre节点开始向后,寻找right节点和suc节点
rightNode = pre;
for(let i = 0;i<right-left+1;i++){
rightNode = rightNode.next;
}
suc = rightNode.next;
//切割子链表
rightNode.next = null;
pre.next = null;
//旋转链表Ⅰ
reverseList(leftNode);
//接回去
pre.next = rightNode;
leftNode.next = suc;
return dummyNode.next;
};