LeetCode(力扣) 206题:反转链表----双指针迭代方法求解附带详细注释

问题描述

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

示例

在这里插入图片描述

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

思路分析

看到题目描述与示例之后,没想到双指针方法也没想到递归方法哈哈哈,菜鸡实锤。自己第一反应是先遍历链表然后将链表的值按顺序储存在列表中,再创建一个新的链表,将列表中的值倒序赋给新链表。好笨哦,看了题解才知道双指针和递归的方法。在面试的时候,面试官大概率会让你在只改变指针方向的基础上做,所以上边的方法肯定不行啦,虽然它可以通过。双指针的思想是定义两个指针依,一指针在前,另一指针紧随其后,依次滑动遍历到链表的最后一个元素。在滑动过程中将前边指针指向元素的指针指向后边指针指向的元素,这句话有点绕哈,直白点就是把链表内的指针全都一次反向,所有指针反向之后,那么整个链表自然就反转过来了。看图叭~

就是指针反转的过程

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
	   # 反转链表
       def reverse(head):
  		   # 定义前指针和后指针,前指针指向head节点,后指针指向None(因为反转后链表最后一个元素为None)
           after = None
           before = head
           # 开始遍历链表
           while before:
           	   # 首先将前指针保存在一个临时节点next上,因为后边前指针往前移动还要用到,此举是为了防止丢失
               next = before.next
               # 指针反转,前指针反转指向后边的元素
               before.next = after
               # 两指针一次向前移动一位,开始下一循环反转后边的指针
               after = before
               before = next
           # 当所有指针反转完毕,返回后指针
           return after

运行结果

在这里插入图片描述
时间复杂度为o(n),速度还可以,空间上可能还有优化的空间。本文只是个人理解,如有错误欢迎大佬们指正交流。

参考

https://leetcode-cn.com/problems/reverse-linked-list/solution/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值