删除链表重复节点【基础算法精讲 08】_哔哩哔哩_bilibili
237. 删除链表中的节点
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val = node.next.val
node.next = node.next.next
解题就是把当前node的节点的值替换成其下一个,并且指向其下一个指针所指向的下一个节点就可以了。
19. 删除链表的倒数第 N 个结点
三种方法如下:
- 最暴力做法就是先遍历链表,获得链表长度,这样就可以知道要是删的节点在链表的位置,然后就可以进行删除了。
- 将节点依次添加进列表,然后利用列表的性质进行删除
- 首先定义一个哨兵节点,和快慢节点,首先让快的节点先走n步,然后快慢指一起行走,这样快慢指针始终相差n个,等到快指针走完,那么慢指针就是删除节点的前一个位置
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
link = []
link.append(head)
while(head.next != None):
head = head.next
link.append(head)
if len(link) == n:# 删除头节点
link[0] = link[0].next # head[1]有可能越界
else: #删除任意非头节点
link[-n-1].next = link[-n].next # 这里不用link[-n+1]同样是防止越界
return link[0]
灵神方法
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
left = right = dummy = ListNode(next=head)
for _ in range(n):
right = right.next
while right.next:
left = left.next
right = right.next
left.next = left.next.next
return dummy.next
83. 删除排序链表中的重复元素
因为已经排好序,直接暴力循环即可。
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head is None:
return None
cur = head
while cur.next:
if cur.next.val == cur.val:
cur.next = cur.next.next
else:
cur = cur.next
return head
82. 删除排序链表中的重复元素 II
由于已经排好序,那么暴力循环一遍即可。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur = dummy = ListNode(next=head)
while cur.next and cur.next.next:
val = cur.next.val
if cur.next.next.val == val:
while cur.next and cur.next.val == val:
cur.next = cur.next.next
else:
cur = cur.next
return dummy.next