算法学习打卡计划

leetcode第二百零六题—翻转单链表

2020-04-18  本文已影响0人  不分享的知识毫无意义

关于链表还是我理解的不深啊,今天还是恶补一下知识吧。

1.题目

原题

反转一个单链表。

例子

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

2.解析

这道题至少有四种解法,为了锻炼自己,我决定每个写法都写一下。

2.1最传统写法

改变链表的指针指向。这个需要对链表有一个比较深的理解。

2.2 队列写法

队列写法需要遍历两次,关键是要生成一个tmp链表,指向新链表

2.3原链表的操作

原链表操作的关键是要定义一个pre/cur/next,这样不用开辟一个新链表空间,直接就在原链表上操作。

2.4递归写法

递归是真难写啊,首先要了解递归是啥。
递归:问题可以分解为子问题,要有一个公式的推导形式,比如求阶乘,f(n)=n!不叫公式推导形式,而f(n)=n*f(n-1)才是推导形式。那么递推要求以下两点:

3.python代码

##传统解法:
class Solution:
    def reverseList(self, head):
        if head is None or head.next is None:
            return head#空链表和只有一个值的链表,直接输出原链表
        newarray = None
        tmp = None
        while head:
            tmp = head.next
            head.next = newarray
            newarray = head
            head = tmp
        return newarray
##队列写法
    def reverseList(self, head):
        if head is None or head.next is None:
            return head
        p = ListNode(0)
        p.next = head
        quene = []
        newarray = ListNode(0)
        tmp = newarray
        while p.next:
            quene.append(p.next.val)
            p = p.next
        # print(quene)
        for i in range(len(quene)):
            tmp.next = ListNode(quene.pop())
            tmp = tmp.next
        return newarray.next
##原链表操作
    def reverseList(self, head):
        if head is None or head.next is None:
            return head
        pre = None
        next = None
        cur = head
        while cur:
            next = cur.next
            cur.next = pre
            pre = cur
            cur = next
        return pre
#递归解法
    def reverseList(self, head):
        if head is None or head.next is None:
            return head
        new = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return new

上一篇下一篇

猜你喜欢

热点阅读