1. 程式人生 > >leetcode206. Reverse Linked List/92. Reverse Linked List II

leetcode206. Reverse Linked List/92. Reverse Linked List II

題目描述

反轉單鏈表

例子

Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL

解法 easy題目,分為兩種解法:遞迴和非遞迴

解法1

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

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

解法2 非遞迴解法,定義兩個指標

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        pre = None
        cur = head
        while cur:
            temp = cur.next
            cur.next = pre
            pre, cur = cur, temp
        return pre

題目描述

反轉連結串列 - 從位置m到位置n

例子

Input: 1->2->3->4->5->NULL, m = 2, n = 4 Output: 1->4->3->2->5->NULL

思路 開始寫的時候發現很麻煩,好幾個特殊用例(比如m=1)要考慮。所以考慮加一個dummy結點。 把要翻轉的一段先進行翻轉,再把它和前後的連結串列接起來

解法

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseBetween(self, head, m, n):
        """
        :type head: ListNode
        :type m: int
        :type n: int
        :rtype: ListNode
        """
        dummy = ListNode(-1)
        dummy.next = head
        
        node = dummy
        for _ in range(m-1):
            node = node.next
            
        pre = node.next
        cur = pre.next
        for _ in range(n-m):
            temp = cur.next
            cur.next = pre
            pre, cur = cur, temp
            
        # 先和後面串起來
        node.next.next = cur
        node.next = pre
        return dummy.next