数据结构习题 单链表操作

一、书:

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()}')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章