问题描述
给你单链表的头节点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/