劍指offer:刪除鏈表中重復的節點
阿新 • • 發佈:2019-04-23
class and 簡潔 重新 self. cat lis let solution 題目描述
在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後為 1->2->5
在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後為 1->2->5
# Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplication(self, head): """ 給定一個有序的鏈表,刪除所有重復的節點 """ # 我們先設置一個輔助節點 # begin用來定位在返回鏈表的頭節點的前一個節點(輔助節點)上 # pre_node用來定位返回鏈表的尾節點 begin = pre_node = ListNode(0) while head: c = 0 # 當前值出現的次數,初始化為0可以使後續代碼更簡潔 val = head.val # 當前值 # 記錄當前節點,因為無論如何,head都會往前移動一次,當下面這個while退出之後, # cur != head cur = head # 當前值連續出現的次數 while head and head.val == val: c += 1 head = head.next # 如果當前值只連續出現過1次,說明不是重復節點,需要將當前節點添加到鏈表的末尾 # 由於pre_node是定位尾節點的,所以每次添加一個尾節點的時候,需要將原尾節點(pre_node) # 和新的尾節點連接起來,然後將pre_node重新定位到鏈表的尾節點 if c == 1: pre_node.next = cur pre_node = pre_node.next # 當遍歷完整個鏈表之後,註意要將尾節點與Null連接起來 pre_node.next = None # begin在頭節點的前一個節點(輔助節點)上,因此返回begin.next return begin.next
劍指offer:刪除鏈表中重復的節點