删除节点可能丢失头指针,因此创建虚拟头节点,创建两个指针间隔为n,探路的指针cur到结尾时,正好删除pre的下一个节点
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
if not head or not head.next:return None
empty = ListNode(0, head)
pre = empty
cur = empty
for _ in range(n):
cur = cur.next
while cur.next:
pre = pre.next
cur = cur.next
pre.next = pre.next.next
return empty.next
删除所有重复的元素,使每个元素只出现一次
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head: return head
cur = head
while cur.next:
if cur.val == cur.next.val:
cur.next = cur.next.next
else:
cur = cur.next
return head
删除原始链表中所有重复数字的节点,只留下不同的数字
1、这题和上题的不同在于发生重复的情况下,需要考虑pre指针是否变动。发生删除的情况下pre.next = cur.next跳过重复的元素,在确定pre.next元素保留时才改变pre的指向。pre.next == cur时说明cur后续节点不重复该节点可保留
2、while循环边界和上题不同,原因在于此题里层的cur一直在向后移动,此处边界需要注意
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head or not head.next: return head
empty = ListNode(0, head)
pre = empty
cur = head
while cur:
while cur.next and cur.val == cur.next.val:
cur = cur.next
if pre.next == cur:
pre = pre.next
else:
pre.next = cur.next
cur = cur.next
return empty.next