题目链接:https://leetcode-cn.com/problems/reverse-linked-list/
介绍一下反转链表的思路:
首先,先明确一下输入:输入为一个链表的头结点head
具体步骤:
- 先判断头结点或头结点的next属性head.next 是否为None。若是,直接返回该头结点,说明该链表为空或者长度为1,没有反转必要;
- 申请两个变量:
- last变量:初始为None,记录当前操作的节点的前一个节点(也就是反转后的链表的last(下一个)节点)
- tmp变量:初始为None,记录当前节点的next节点(也就是翻转后的链表的前面一个节点)
- 使用while循环,判断当前节点(即head)是否为空;
- 若为空,先将当前的head节点的next属性用tmp变量记录,然后再将last记录的上一个节点赋值给head.next。这一操作就是将当前节点的next指针指向上一个节点last,这也是反转链表的核心;与此同时防止原来head.next指针指向的下一个节点丢失,所以用tmp暂时记录一下
- 然后,再将当前节点head赋值给last,将刚刚tmp记录的现节点的next节点赋值给head,即last(前一个节点)和head(当前节点)均向前走一步
- 最终,当当前节点head为空的时候,返回其上一个节点,这就是新的反转过的链表的头结点。
上代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if head is None or head.next is None:
return head
last,tmp = None,None
while head:
tmp = head.next
head.next = last
last = head
head = tmp
return last