[路飞] 206.反转列表

114 阅读1分钟

题目详情

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。  

示例 1:

微信图片_20220221134128.jpg

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:

微信图片_20220221134135.jpg 输入:head = [1,2] 输出:[2,1] 示例 3:

输入:head = [] 输出:[]  

提示:

链表中节点的数目范围是 [0, 5000] -5000 <= Node.val <= 5000

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

1645423448(1).jpg ①首先,我们定义两个快慢指针。

1.将慢指针pre指向null let pre = null

2.将快指针cur指向头结点 let cur = head

再定义一个指针next指向cur所指向结点的下一个结点 let next = cur.next

next结点的作用保证我们反转时要反转的结点后面的结点不丢失

我们将cur指针所指向的结点指向pre指针指向的结点

222222222.jpg

②接着移动指针pre到指针cur的所在位置,移动指针cur到指针next的位置

33333333.jpg

4444444.jpg

此时我们就已经反转了第一个结点。

将next指针指向cur指针所指向结点的下一个结点。

1111111111.jpg

然后重复操作

5555555.jpg

如此循环,当cur指针指向null时,我们就完成了整个列表的反转。

1645451203(1).jpg

代码详情 迭代

 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if(!head) return null;
    let pre=null,cur=head;
    while(cur){
        let next=cur.next;
        cur.next=pre;
        pre=cur;
        cur=next;
    }
    return pre;
};

代码详情 ES6解构赋值

 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if(!head) return null;
    let pre=null,cur=head;
    while(cur){
        [cur.next,pre,cur]=[pre,cur,cur.next];
    }
    return pre;
};