您的位置:首页 > 编程语言 > Python开发

基于Python实现单向链表的反转

2019-05-28 12:29 429 查看

循环方法

循环方法的思想是建立三个变量,分别指向当前结点,当前结点的前一个结点,新的head结点,从head开始,每次循环将相邻两个结点的方向反转。当整个链表循环遍历过一遍之后,链表的方向就被反转过来了。


class ListNode:
def __init__(self, x):
self.val = x
self.next = None

def reverse(head):  # 循环的方法反转链表
if head is None or head.next is None:
return head
# 定义反转的初始状态
pre = None
cur = head
newhead = head
while cur:
newhead = cur
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
return newhead

if __name__ == '__main__':
head = ListNode(1)  # 测试代码
p1 = ListNode(2)  # 建立链表1->2->3->4->None;
p2 = ListNode(3)
p3 = ListNode(4)
head.next = p1
p1.next = p2
p2.next = p3
p = reverse(head)  # 输出链表 4->3->2->1->None
while p:
print(p.val)
p = p.next

递归方法

根据递归的概念,我们只需要关注递归的基例条件,也就是递归的出口或递归的终止条件,以及长度为n的链表与长度为n-1的链表的关系即可
长度为n的链表的反转结果,只需要将长度为n-1的链表反转后,将链表最后指向None修改为指向长度为n的链表的head,并让head指向None(或者说在链表与None之间添加长度为n的链表的head结点)
即反转长度为n的链表,首先反转n-1链表,然后再操作反转好的链表与head结点的关系;至于n-1长度的链表怎么反转,只需要把它再拆分成node1和n-2的链表…


class ListNode:
def __init__(self, x):
self.val = x
self.next = None

def reverse(head, newhead):  # 递归,head为原链表的头结点,newhead为反转后链表的头结点
if head is None:
return
if head.next is None:
newhead = head
else:
newhead = reverse(head.next, newhead)
head.next.next = head
head.next = None
return newhead

if __name__ == '__main__':
head = ListNode(1)  # 测试代码
p1 = ListNode(2)  # 建立链表1->2->3->4->None
p2 = ListNode(3)
p3 = ListNode(4)
head.next = p1
p1.next = p2
p2.next = p3
newhead = None
p = reverse(head, newhead)  # 输出链表4->3->2->1->None
while p:
print(p.val)
p = p.next

参考:https://www.geek-share.com/detail/2615525061.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: