单链表反转
#!/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号
浙公网安备 33010602011771号