leetcode19. 删除链表的倒数第 N 个结点
解题重点:
1.删除结点需要定位到被删除结点的前一个结点
2.倒数第N个结点可转化为顺数第Length-N个结点
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
empty = ListNode()
empty.next = head
p,q = empty,head
while n:
n -= 1
q = q.next
while q:
q = q.next
p = p.next
p.next = p.next.next
return empty.next
leetcode 83. 删除排序链表中的重复元素
解题重点:
1.注意是排序链表,根据排序链表可知重复元素一定近邻
2.头节点肯定是动不了,不用虚拟头节点
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head:return None
fast,slow = head,head
while fast:
if fast.val != slow.val:
slow.next = fast
slow = slow.next
fast = fast.next
slow.next = None
return head
leetcode 82. 删除排序链表中的重复元素 II
解题重点:
1.删除有重复的元素,则head结点有可能也会被删除,需要加虚拟头节点
2.指针临近的时候不用跳越(不需要slow.next = fast.next)
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
empty_head = ListNode()
empty_head.next = head
pre,cur = empty_head,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_head.next