1. 程式人生 > >資料結構與演算法(三)—— 連結串列(python)

資料結構與演算法(三)—— 連結串列(python)

1 反轉連結串列(一)

反轉一個單鏈表

class Solution(object):
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        prev_node = None
        curr_node = head
        while curr_node:
            next_node = curr_node.next # Remember next node
            curr_node.next = prev_node  # REVERSE! None, first time round.
prev_node = curr_node # Used in the next iteration. curr_node = next_node # Move to next node. head = prev_node return head

2 反轉連結串列(二)

反轉從位置 m 到 n 的連結串列。請使用一趟掃描完成反轉

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
# self.val = x # self.next = None # 1(pre) 4 (reverse)->3->2 5(cur) class Solution(object): def reverseBetween(self, head, m, n): """ :type head: ListNode :type m: int :type n: int :rtype: ListNode """ if m==n: return
head dummyNode = ListNode(0) dummyNode.next = head pre = dummyNode for i in range(m-1): pre = pre.next cur = pre.next reverse = None for i in range(n-m+1): next = cur.next cur.next = reverse reverse = cur cur = next pre.next.next = cur pre.next = reverse return dummyNode.next

3 連結串列的中間節點問題

class Solution(object):
    def middleNode(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        fast = slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
        return slow
class Solution(object):
    def middleNode(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        A = [head]
        while A[-1].next:
            A.append(A[-1].next)
        return A[len(A) / 2]

4 兩數相加(一)

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        dummy = cur = ListNode(0)
        carry = 0
        while l1 or l2 or carry:
            if l1:
                carry += l1.val
                l1 = l1.next
            if l2:
                carry += l2.val
                l2 = l2.next

                cur.next = ListNode(carry % 10) # 個位
                cur = cur.next 
                carry //= 10 
        return dummy.next

5 兩數相加(二)

6 版本號問題 165

class Solution:
    def compareVersion(self, version1, version2):
        """
        :type version1: str
        :type version2: str
        :rtype: int
        """
        versions1 = [int(v) for v in version1.split(".")]
        versions2 = [int(v) for v in version2.split(".")]
        for i in range (max(len(version1), len(version2))):
            v1 = versions1[i] if i < len(versions1) else 0
            v2 = versions2[i] if i < len(versions2) else 0
            if v1 > v2:
                return 1
            elif v1 < v2:
                return -1
            else:
                return 0