1. 程式人生 > >劍指offer:刪除鏈表中重復的節點

劍指offer:刪除鏈表中重復的節點

class and 簡潔 重新 self. cat lis let solution

題目描述
在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表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:刪除鏈表中重復的節點