[路飞]_今夜反转链表(一)

280 阅读1分钟

「这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

206. 反转链表

我一个学前端的,对链表这种数据结构真的是不太熟悉;反转链表哪就更不熟悉了,花了点心思,搞定链表反转。通过下面的动画和图片,简单明了表达链表反转;若你看完还不懂链表反转,你来打我

具体思路如下:

定义指针pro为空,表示反转链表后的前一个节点头;

定义指针current指向当前head,表示当前节点指针;

定义next只想current的next,表示下一轮开始的头指针;

第1轮:

将current的next指向pro;这一步非常关键,current的next指针此时应该只想next;此时将current的next指针pro,只想前一个节点头,将当前节点的指针反转,这样current.next和next的关系就断掉了;所以需要next保存current.next.next之后的链表;

current.next与next关系已经断掉,所以pro节点头指针可以前进一步,pro 指向当前的 current

current向前一步,指向next,即current 只想原来的current.next;

next向前一步,只想next.next;这里处理一下边界,next = null的时候不要在让next只想next.next了,代码容易报错

下一轮如上,直至current为null

返回答案即可

动态度

111.gif

静态图

未命名.001.jpeg

未命名.002.jpeg

未命名.003.jpeg

未命名.004.jpeg

未命名.005.jpeg

未命名.006.jpeg

未命名.007.jpeg

未命名.008.jpeg

未命名.009.jpeg

未命名.010.jpeg

未命名.011.jpeg

代码

var reverseList = function(head) {
    if(head === null) return null
    let pre = null;
    let current = head;
    let next = head.next;
    while(current){
        current.next = pre;
        pre =current;
        current = next;
        next = next?next.next:null
    }
    return pre
};