leetcode笔记--Reverse Linked List

来源:互联网 发布:node req.session 编辑:程序博客网 时间:2024/06/06 17:23

    前话:今天开始刷leetcode的第一道题,我所选用的语言是较为熟悉的python,其实自己似乎并没有一门十分精通的语言,在大学时候有系统学过c语言,但由于后面实践中实际上用的很少,现在很多特性都已经快忘了。后来用的较多的是java,虽然用的多,但很多经典的特性也没有用到过,比如对于流的一些应用总是没那么熟练,到现在由于学习openstack而接触到了python语言,自己找了本书倒是从头到尾自学了一遍算是一个系统的了解和学习吧,所以刷题决定使用python,也可以将之前自学的应用到实践中来,对这门语言能有更加深入的理解和应用。现在刚做完的一个项目所使用的是php和js,没有学过,但了解了一下基本的语法就开始写了,基本上是哪里不会就百度,总能找到答案,总能解决问题,但是也从没有系统的学习过,所以很多精髓我即没有掌握,甚至都不知道。

    我一个师兄说python在面试中可能还是比较小众,让我至少还得熟练一门其他的语言,我决定重新学习java,他们还有很多相似性,所以后期得多提醒自己更加深入和熟练这两门语言:python、java。

   好了,开始分析题目了!

题目:难度(Easy)

Reverse a singly linked list.

Hint:

A linked list can be reversed either iteratively or recursively. Could you implement both?

Tags:Linked List

Similar problems:(M)Reverse Linked List II、(M)Binary Tree Upside Down、(M)PalinDrome Linked List

非递归实现:采用”头插法“,将链表的节点依次拿下,再头部插入,这样最后刚好形成逆向链表,最先插入的靠前的节点跑到了后面,而最晚插入的靠后的节点却跑到了靠头部的位置。

# Definition for singly-linked list.# class ListNode(object):#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution(object):    def reverseList(self, head):        """        :type head: ListNode        :rtype: ListNode        """        #非递归实现        if head and head.next:            p = head            head = None                        while p:                q = p                p = p.next                q.next = head                head = q        return head
递归实现,首先反转从第二个结点到最后一个结点的链表,然后再将头结点放到已反转链表的最后,函数返回新链表的头结点。递归的精髓在于将next当做参数传入reverseList函数时,在下一次递归中对参数的操作,会反应在上次的参数值上。然后再添加反向的引用链,思路巧妙无法言喻。

# Definition for singly-linked list.# class ListNode(object):#     def __init__(self, x):#         self.val = x#         self.next = Noneclass Solution(object):    def reverseList(self, head):        """        :type head: ListNode        :rtype: ListNode        """        if head is None or head.next is None:            return head        newHead = self.reverseList(head.next)        head.next.next = head        head.next = None        return newHead


1 0