单链表反转
#!/usr/bin/env python
#coding:utf-8
"""
----------------------------------------
description:
单链表反转
author: sss
date:
----------------------------------------
change:
----------------------------------------
"""
__author__ = 'sss'
def pr_type(i, info=''):
print(info, i, type(i))
# node
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
# linked list
class LinkedList(object):
@staticmethod
def make_linkedlist(li:list):
"""
按列表给出元素生成链表
:param li: list
:return:
"""
if not li:
return
head = ListNode(li[0])
node = head
for _ in li[1:]:
node.next = ListNode(_)
node = node.next
return head
def print_linkedlist(self, llist:ListNode):
"""
打印链表
:param llist:
:return:
"""
cur = llist
serial_number = 1
print("开始打印链表:")
while cur:
#print('[%s]'%serial_number, cur.val)
if cur.next:
print(cur.val, end=' -> ')
else:
print(cur.val)
serial_number += 1
cur = cur.next
print('')
@staticmethod
def reverse_list_pointer(head):
"""
反转链表
三指针法
:param head:
:return:
"""
if not head or not head.next:
return head
p, q, cur= None, None, head
while cur:
q = cur.next
cur.next, p = p, cur
cur = q
return p
@staticmethod
def reverse_list_tailinsert(head):
"""
尾插法
1.将第三个及后序的元素依次插入到第一个元素后面
ABCDE转换成AEDCB
2.调整头尾链接
:param head:
:return:
"""
if not head or not head.next:
return head
p = head.next
while p.next:
q = p.next
p.next = q.next
q.next, head.next = head.next, q
p.next = head
head = head.next
p.next.next = None
return head
def reverse_recursion(self, head):
"""
递归法
:param head:
:return:
"""
if not head or not head.next:
return head
new_head = self.reverse_recursion(head.next)
head.next.next = head
head.next = None
return new_head
def test():
ll_class = LinkedList()
# 生成链表
li = list(range(4,20))
link_list = ll_class.make_linkedlist(li)
#print(res)
print("生成链表结果如下:")
ll_class.print_linkedlist(link_list)
# 反转链表
r_list = ll_class.reverse_list_pointer(link_list)
print("方法<%s>反转链表结果如下:"%(ll_class.reverse_list_pointer.__name__))
ll_class.print_linkedlist(r_list)
# 反转链表
res = ll_class.reverse_list_tailinsert(r_list)
print("方法<%s>反转链表结果如下:"%ll_class.reverse_list_tailinsert.__name__)
ll_class.print_linkedlist(res)
#print(res)
# 反转链表
res = ll_class.reverse_recursion(res)
print("方法<%s>反转链表结果如下:"% ll_class.reverse_recursion.__name__)
ll_class.print_linkedlist(res)
#print(res)
# res = tr_class._preorder_traeversal()
if __name__ == '__main__':
test()
pass
# pr_type('s')
日拱一卒无有尽,功不唐捐终入海

浙公网安备 33010602011771号