數據結構習題 單鏈表操作

一、書:

http://images.china-pub.com/ebook4905001-4910000/4909472/ch03.pdf

二、題:在這裏插入圖片描述

三、答案:

import copy

class Node:
    """
    節點類,value是本節點值,next是指向的下一節點
    """
    def __init__(self,value,next=None):
        self.value = value
        self.next = next

class LinkList:
    """
    鏈表類,head是頭結點
    """
    def __init__(self):
        self.head = None
    
    def append(self,element_value):
        """
        向鏈表中追加元素
        """
        if not self.head:
            self.head = Node(element_value)
        else:
            p = self.head
            while p.next:
                p = p.next
            p.next = Node(element_value)
    
    def print_all(self):
        """
        打印鏈表
        """
        p = self.head
        temp= []
        while p:
            temp.append(p.value)
            p = p.next
        print(f'{temp}')

    def get_all(self):
        """
        輸出鏈表
        """
        p = self.head
        temp= []
        while p:
            temp.append(p.value)
            p = p.next
        return f'{temp}'
    
    def sort(self):
        """
        鏈表排序 從小到大
        """
        if self.head:
            ne_pod= self.head.next
            while ne_pod:
                x = ne_pod.value
                p = self.head
                # 頭結點比下一節點小,繼續
                while p is not ne_pod and p.value <= x:
                    p = p.next
                # 頭結點不比下一節點小,交換兩個節點value,再繼續
                while p is not ne_pod:
                    y = p.value
                    p.value = x
                    x = y
                    p = p.next
                # 頭節點已經是下一個了,對比的ne_pod用下下一個
                ne_pod.value = x
                ne_pod = ne_pod.next

    def del_element(self,element_value):
        """
        刪除鏈表中某個元素
        """
        a = self.head
        b = self.head.next
        if not a:
            return
        if a.value == element_value:
            self.head = b
        while b:
            if b.value == element_value:
                a.next = b.next
            a = a.next
            b = b.next

    def del_minimal(self):
        """
        刪除鏈表中最小元素
        """
        temp = copy.deepcopy(self)
        temp.sort()
        element = temp.head.value
        self.del_element(element)
    
    def del_if(self,pred):
        """
        刪除鏈表中滿足pred的元素
        """
        temp = self.head
        while temp:
            if pred(temp.value):
                self.del_element(temp.value)
            temp = temp.next
    
    def del_duplicate(self):
        """
        鏈表去重
        """
        # 字典裏保存每個元素出現次數
        temp = self.head
        adict = dict()
        while temp:
            if temp.value not in adict:
                adict[temp.value] = 1
            else:
                adict[temp.value] += 1
            temp = temp.next
        # 遍歷每個節點,適時跳過重複元素
        temp1 = self.head
        temp2 = self.head.next
        if adict[temp1.value] > 1:
            adict[temp1.value] *= -1
        while temp2:
            if adict[temp2.value] > 1:
                adict[temp2.value] *= -1
                temp1 = temp1.next
            elif adict[temp2.value] < 0:
                temp1.next = temp2.next
            else:
                temp1 = temp1.next
            temp2 = temp2.next


def pred(element_value):
    """造一個條件,比如值爲4滿足條件"""
    if element_value == 4:
        return True

測試方法

1.構造鏈表

linklist = LinkList()
linklist.append(1)
linklist.append(2)
linklist.append(2)
linklist.append(3)
linklist.append(3)
linklist.append(0)
linklist.append(4)
linklist.append(1)
linklist.append(1)
linklist.print_all()

2.刪除最小

linklist.del_minimal()
print(f'刪除最小:{linklist.get_all()}')

3.條件刪除

linklist.del_if(pred)
print(f'條件刪除:{linklist.get_all()}')

4.去重

linklist.del_duplicate()
print(f'去重:{linklist.get_all()}')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章