链表--206题--反转链表

zhanglei 2022年06月04日 378次浏览

题目

leetcode链接:206. 反转链表 - 力扣(LeetCode)

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

示例 1:

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

示例 2:

输入:head = [1,2]
输出:[2,1]

个人思路

如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。

其实只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表,如图所示:

之前链表的头节点是元素1, 反转之后头结点就是元素5 ,这里并没有添加或者删除节点,仅仅是改变next指针的方向。

那么怎么反转呢?思路如下图:

首先定义一个指针cur指向头结点,再定义一个指针pre,初始化为null。

然后开始改变next指向了,cur.next=pre,这条语句有个问题,cur.next原本指向2这个结点,执行完cur.next=pre 后2结点就找不到了。因此我们要保存下一个结点temp=cur.next.

同时,pre 移动到cur的位置,cur移动到tempt的位置。

循环上述操作,循环停止cur==null,这个时候返回pre即可。

个人解答

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null){
            return head;
        }else{
            ListNode cur=head;
            ListNode pre=null;
            while(cur!=null){
                //先保存下一个结点
                ListNode tempt=cur.next;
                cur.next=pre;
                pre=cur;
                cur=tempt;
            }
            return pre;
        }
    }
}