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
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
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