Exemplo n.º 1
0
    def get_loop_linked_list(self, n):
        sll = SingleLinkedList()

        head = sll.add_item_from_arr(list(range(n)))
        if head is None:
            return None, None
        ptr = head
        while ptr.next:
            ptr = ptr.next
        ptr.next = head
        return head, ptr

        ## 直接用list来模拟环形链表,找到删除数字之间的下标变化规律
        def LastRemaining_Solution(self, n, m):
            if n < 1 or m < 1:
                return -1
            arr = list(range(n))
            index = (m - 1) % len(arr)
            while len(arr) > 1:

                arr.pop(index)
                index = (index + m - 1) % len(arr)
            return arr[0]
    # 迭代解法
    def ReverseList(self, pHead):
        # write code here
        p_reverse_head = None
        cur_node = pHead
        pre_node = None
        while cur_node is not None:
            next_node = cur_node.next  ## 需要提前保存好下一个节点的值
            if next_node is None:
                p_reverse_head = cur_node
            cur_node.next = pre_node
            pre_node = cur_node
            cur_node = next_node
        return p_reverse_head

    ## 递归解法
    def ReverseList(self, pHead):
        if not pHead or not pHead.next:
            return pHead
        else:
            pReversedHead = self.ReverseList(pHead.next)
            pHead.next.next = pHead  ## 把None换掉
            pHead.next = None  ## 最后要接一个None
            return pReversedHead


sll = SingleLinkedList()
sll.add_item_from_arr([1, 2, 3, 4])
sol = Solution()
res = sol.ReverseList(sll.head)
pass
Exemplo n.º 3
0
        for i in range(k - 1):  ## 在前指针移动的时候就对非正常值进行判断
            if pAHead.next != None:
                pAHead = pAHead.next
            else:
                return None
        pBehind = head
        while pAHead.next != None:
            pAHead = pAHead.next
            pBehind = pBehind.next
        return pBehind

    def FindMidNode(self, head):  ## 这双指针的思想非常棒
        if not head:
            return None

        pahead = head
        pbehind = head
        while pahead.next:
            pahead = pahead.next.next
            pbehind = pbehind.next
        return pbehind


sll = SingleLinkedList()
sll.add_item_from_arr([1, 2, 3, 4, 5])
sll.add_item_from_arr([1])

sol = Solution()
res = sol.FindMidNode(sll.head)
pass
Exemplo n.º 4
0
        return count

        ## 解法三:调用辅助栈(利用栈后入先出的特性)
        if not pHead1 or not pHead2:
            return None
        stack1, stack2 = [], []
        while pHead1:
            stack1.append(pHead1)
            pHead1 = pHead1.next
        while pHead2:
            stack2.append(pHead2)
            pHead2 = pHead2.next
        res_temp1 = None
        while stack1 and stack2:
            temp1 = stack1.pop()
            temp2 = stack2.pop()

            if temp1.val != temp2.val:
                return res_temp1
            res_temp1 = temp1

        return res_temp1


sll = SingleLinkedList()
pHead1 = sll.add_item_from_arr([1, 2, 3, 4, 5])
pHead2 = sll.add_item_from_arr([1, 2, 3, 4, 5])
sol = Solution()
res = sol.FindFirstCommonNode(pHead1, pHead2)
pass
                pointer.next = pHead2
                pHead2 = pHead2.next
            pointer = pointer.next

        if pHead1:
            pointer.next = pHead1
        if pHead2:
            pointer.next = pHead2
        return dummy.next

    ## 递归代码
    def Merge(self, pHead1, pHead2):
        if not pHead1:
            return pHead2
        if not pHead2:
            return pHead1
        if pHead1.val < pHead2.val:
            pHead1.next = self.Merge(pHead1.next, pHead2)
            return pHead1
        else:
            pHead2.next = self.Merge(pHead1, pHead2.next)
            return pHead2


sll = SingleLinkedList()
pHead1 = sll.add_item_from_arr([2, 3, 6])
pHead2 = sll.add_item_from_arr([9999])
sol = Solution()
res = sol.Merge(pHead1, pHead2)
pass