LeetCode----Reverse Linked List

来源:互联网 发布:绕过网络白名单限制 编辑:程序博客网 时间:2024/05/20 12:47

Reverse Linked List

Reverse a singly 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        """        h = head        p = h        q = h.next        isFirst = True                if not head or not head.next:  # 当head为空链表或者链表只有一个值            return head                if not q:  # 当链表只有两个值时,反转头和尾指针            q.next = h            h.next = None            return q                while q:            r = q.next            if isFirst:                isFirst = False                p.next = None            q.next = p            p = q            q = r        return p            

---------------------------------------------------------------------------------------------------------------------------

2016-05-01补充:

代码1:

class Solution(object):    def reverseList(self, head):        """        :type head: ListNode        :rtype: ListNode        """        if not head or not head.next:            return head        pre = head        mid = head.next        post = mid.next        pre.next = None        while post:            mid.next = pre            pre = mid            mid = post            post = post.next        mid.next = pre        return mid

代码2:# 代码2的简洁性和易理解性优于代码1

class Solution(object):    def reverseList(self, head):        """        :type head: ListNode        :rtype: ListNode        """        if head is None:            return head        pre = None        mid = head        post = None        while mid:            post = mid.next            mid.next = pre            pre = mid            mid = post        return pre

递归代码:

class Solution2(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)  # 得到表尾结点为新的链表头,直接返回该节点        # 递归回退过程中进行当前节点的反向        tail = head.next        tail.next = head        head.next = None        return newhead



Discuss中看到的好的代码:

Method 1: uses self as a dummy node for swapping

def reverseList(self, head):    pre, pre.next, tail = self, head, head    while tail and tail.next:        pre.next, pre.next.next, tail.next = \                  tail.next, pre.next, tail.next.next    return self.next

Method 2: swapping using two variable, pre and cur

def reverseList(self, head):    pre, cur = None, head    while cur:        cur.next, pre, cur = pre, cur, cur.next    return pre

Method 3: Recursive method by storing previous node in the function argument.

def reverseList(self, head, pre = None):    if not head: return pre    cur, head.next = head.next, pre    return self.reverseList(cur, head)

0 0
原创粉丝点击