题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
递归
每一次递归实现局部反转,让当前结点的 next指针指向 NULL,当前结点的下一个结点的 next 指针指向当前结点。
双指针迭代
举例说明,输入链表为:1->2->3->NULL
有两个指针pre和cur,分别指向该结点的前一结点和该结点
通过遍历链表的当前结点,把每一结点的下一个结点作为当前结点,前一结点为该结点,以head为例:
// 此时 cur 指向结点 1 ,pre 指向 None
cur = head
cur.next = 2
pre = None
对于反转后的结果,需要3->2->1->NULL
// 当 cur 指向结点 1 ,pre 指向 2
cur = 1
cur.next = None
pre = 2
则要经过:cur.next 和 pre 指向的结点值互换,并且 cur 要不断叠加直到把该链表全部反转。
提交代码
递归
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
// 若当前结点为空结点,此时 cur 是当前最后结点
if(head==None or head.next==None):
return head
cur = self.reverseList(head.next)
head.next.next = head
head.next = None
return cur
双指针迭代
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
pre = None
cur = head
while cur:
temp = cur.next
cur.next = pre
// 进入下一次迭代
pre = cur
cur = temp
return pre
学习总结
- 链表的数据结构在python中的表示;
- 数据结构类型的处理思想相通,可以根据java的实现方式写出python的代码思路。