力扣206.反转链表(Java解法)

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

 这题反复做过好多次,这次将自己的思路总结后记录下来。

思路一:(双指针)

用双指针改变原链表中的指针的指向即可。初始化一个指针cur指向头结点head,初始化一个指针pre指向空。

ListNode cur = head;
ListNode pre = null;

其中cur负责遍历链表,而pre则负责指向链表反转后的头结点。如下图为整个迭代过程:

初始时pre指向null,cur指向head。如下图:

这里分为4步完成一次迭代:

(1)保存cur的下一个结点为temp;

            temp = cur.next;

(2)将cur的下一个结点指向pre;

            cur.next = pre;

到这里已经完成了第一个结点的反转。接下来是将pre和cue同时向后移动,准备下一步的迭代。

(3)pre指向cur;

            pre = cur;

(4)cur指向事先保存的结点temp,也就是向后移动一位的意思。

            cur = temp;

经过一次迭代后,链表的指针指向变为如下图所示:

 

到这里可以发现,仅仅是从图上来说,pre始终在cur的前面一个位置。实际上cur.next=pre。当cur为空时,说明已经迭代完整个链表,可得出迭代的终止条件为cur == null。

当整个链表迭代完后如下图:此时cur指向空,说明链表迭代结束。

 

具体的迭代代码为:

temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;

最后完整的代码为:

    public ListNode reverseList(ListNode head) {
        ListNode temp;
        ListNode pre = null;
        ListNode cur = head;
        while(cur != null){
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }

这仅仅是其中的一种解法,还包括递归法。后续会补充!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

psvm_code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值