单链表反转

#!/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')

posted @ 2020-02-22 23:41  木林森__𣛧  阅读(173)  评论(0)    收藏  举报