Leetcode206–反转链表
反转一个单链表
编程语言:python
作者:黑暗主宰
邮箱:shengzhanhe@gmail.com
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 |
---|
解题思路
链表是一种物理存储单元存储单元上非连续、非顺序的存储结构,所以不能直接像数组那样直接通过索引获取数组,需要根据前一个节点去知道下一个节点的位置。
所以我们要反转整个链表就是通过下面的方法,逐个的断开每一个节点并指向前一个节点:
这里就先建立一个节点类,对于一个单链表而言,一个节点应该包含存储链表元素的变量和用来存放下一个节点位置的变量,代码如下:
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
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
注: 文中有写错的地方,欢迎大家不吝指正!!!