Leetcode206--反转链表

Leetcode206–反转链表

反转一个单链表

编程语言:python

作者:黑暗主宰

邮箱:[email protected]

文章目录

  • Leetcode206--反转链表
    • 题目描述
    • 解题思路

Leetcode206–反转链表

题目描述

原题链接:

​ https://leetcode-cn.com/problems/reverse-linked-list/ (中文)

​ https://leetcode.com/problems/reverse-linked-list/ (英文)

题目描述:

​ 反转一个单链表。

说明:

  你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:
  输入: 1->2->3->4->5->NULL
  输出: 5->4->3->2->1->NULL

解题思路

链表是一种物理存储单元存储单元上非连续、非顺序的存储结构,所以不能直接像数组那样直接通过索引获取数组,需要根据前一个节点去知道下一个节点的位置。

Leetcode206--反转链表_第1张图片

所以我们要反转整个链表就是通过下面的方法,逐个的断开每一个节点并指向前一个节点:

Leetcode206--反转链表_第2张图片

这里就先建立一个节点类,对于一个单链表而言,一个节点应该包含存储链表元素的变量和用来存放下一个节点位置的变量,代码如下:

class LinkNode(object):
    def __init__(self, elem=None):
        self.elem = elem
        self.next = None

然后为了简单起见,直接通过上面的节点,手动的建立一个单链表,重点放在反转链表上

n1 = LinkNode(1)
n2 = LinkNode(2)
n3 = LinkNode(3)
n4 = LinkNode(4)
n5 = LinkNode(5)
n1.next = n2
n2.next = n3
n3.next = n4
n4.next = n5

上面的单链表是n1为头节点,n5为未节点

然后按照上面的图解,通过迭代和递归两种方法来反转链表

class LinkList(object):
    def ReverseList(self, pHead):
        pReversedHead = None
        pNode = pHead
        pPrev = None
        
        while pNode:
            pNext = pNode.next
            if not pNext:
                pReversedHead = pNode
            pNode.next = pPrev
            pPrev = pNode
            pNode = pNext
        #return pReversedHead
    
    #递归
    def ReverseListRec(self, pHead):
        if not pHead or not pHead.next:
            return pHead
        else:
            pReversedHead = self.ReverseListRec(pHead.next)
            pHead.next.next = pHead
            pHead.next = None
            #return pReversedHead

通过下面的代码,验证一下是不是正确:

def travel(head):
    if not head:
        return
    cur = head
    while cur:
        print(cur.elem, end = ' ')
        cur = cur.next
    print()
print("---------反转前-----------")
travel(n1)
l = LinkList()
#print(l.ReverseList(n1).elem)
l.ReverseListRec(n1)
print("---------反转后-----------")
travel(n5)

Leetcode提交的版本:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        
        pReversedHead = None
        pNode = head
        pPre = None
        while pNode:
            pNext = pNode.next
            if not pNext:
                pReversedHead = pNode
            pNode.next = pPre
            pPre = pNode
            pNode = pNext
        return pReversedHead

注: 文中有写错的地方,欢迎大家不吝指正!!!

你可能感兴趣的:(python,算法,leetcode刷题)