defaddAtTail(self, val: int) -> None: p = self.dummy while p.nextisnotNone: p = p.next p.next = Node(val, None) self.length += 1
defaddAtIndex(self, index: int, val: int) -> None: if index <= self.length: p = self.dummy for i inrange(index): p = p.next p.next = Node(val, p.next) self.length += 1
defdeleteAtIndex(self, index: int) -> None: if index < self.length: i = 0 p = self.dummy while i < index: p = p.next i += 1 p.next = p.next.next self.length -= 1
# Your MyLinkedList object will be instantiated and called as such: # obj = MyLinkedList() # param_1 = obj.get(index) # obj.addAtHead(val) # obj.addAtTail(val) # obj.addAtIndex(index,val) # obj.deleteAtIndex(index)
206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
1 2
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
1 2
输入:head = [1,2] 输出:[2,1]
示例 3:
1 2
输入:head = [] 输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
**进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next classSolution: defreverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: pre = None cur = head while cur: nextNode = cur.next cur.next = pre pre = cur cur = nextNode return pre
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3 输出:Intersected at '8' 解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。 从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。 在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。 — 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。
示例 2:
1 2 3 4 5
输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1 输出:Intersected at '2' 解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。 从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。 在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None
classSolution: defdetectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]: # f = 2s # s = a + nr # f = a + tr # f = s + (n-t)r # s = kr f, s = head, head while f and f.next: f = f.next.next s = s.next
if f == s: # hit # pos = 0 s = head while f != s: f=f.next s=s.next # pos += 1 return f