数据结构和算法-11.单向链路-重学(自写)-单向链表-后插入、指定插入02

# CY3761 | 2021-12-06 15:45

# 节点类
import copy


class Node:
    def __init__(self, _item, _next=None):
        self._item = _item  # 数据域
        self._next = _next  # 指针域
    
    def next(self, *args):
        if len(args) == 0:
            return self._next
        
        _next = args[0]
        if isinstance(_next, Node) or _next is None:
            self._next = _next
    
    def item(self, *args):
        if len(args) == 0:
            return self._item
        
        self._item = args[0]
    
    def __str__(self):
        iterable = [self._item, hex(id(self))]
        
        if self._next:
            iterable.append(hex(id(self._next)))
        
        return ', '.join(map(str, iterable))
    
    def chain(self):  # 当前节点下的所有关联节点链
        chain = []
        cNext = self._next
        chain.append(self._item)
        
        while cNext:
            chain.append(cNext.item())
            cNext = cNext.next()  # 指引到下一个节点
        
        return chain


# 链表类
class SingleChain:
    def __init__(self):
        self._leng = 0
        self._head = None
    
    # 链表是否为空
    def isEmpty(self):
        return self._leng <= 0
    
    # 链表长度
    def length(self):
        return self._leng
    
    # 链表所有节点(值)
    def items(self):
        if self._head:
            return self._head.chain()
        else:
            return []
    
    # 向链表头添加节点
    def before(self, item):
        # A, A.next(None), self._head = A
        # B, B.next(A), self._head = B
        # C, C.next(B), self._head = C
        # D, D.next(C), self._head = D
        # ...
        
        item = Node(item)  # 新建节点
        item.next(self._head)  # 第一次是None
        
        self._head = item  # 增加的做头
        self._leng += 1
    
    # 向链表尾添加节点
    def after(self, item):
        # A, self._head = A
        # B, A.next(): None, A.next(B)
        # C, B.next(): None, B.next(C)
        # D, C.next(): None, C.next(D)
        
        item = Node(item)  # 新建节点
        
        if not self._head:
            self._head = item
        else:
            aItem = self._head  # A
            
            while aItem.next():  # A.next():
                aItem = aItem.next()  # B.next()
            aItem.next(item)  # A.next(B) | B.next(C) | C.next(D)
        
        self._leng += 1
    
    # 向链表指定位置添加节点
    def where(self, pos, item):
        pos = int(pos)
        
        if pos <= 0:
            return self.before(item)
        elif pos >= self._leng:
            return self.after(item)
        else:
            item = Node(item)  # 新建节点
            aItem = self._head  # A
            bItem = aItem
            
            while pos > 0:
                bItem = aItem
                aItem = aItem.next()
                pos -= 1
            
            item.next(aItem)
            bItem.next(item)
            self._leng += 1
    
    # 删除第一个指定值的节点
    def remove(self, item):
        pass
    
    # 删除指定位置的节点
    def removePos(self, pos):
        pass
    
    # 修改向链表指定位置的节点值
    def update(self, pos, item):
        pass
    
    # 查找指定值的节点是否存在
    def search(self, item):
        pass


if __name__ == '__main__':
    SC = SingleChain()
    print(SC.items(), SC.isEmpty(), SC.length())
    
    for _ in ['A', 'B', 'C', 'D', 'E']:
        print('-' * 80)
        SC.before(_)
        print(SC.items(), SC.isEmpty(), SC.length())
    
    ###########################################################
    
    SC = SingleChain()
    print(SC.items(), SC.isEmpty(), SC.length())
    
    for _ in ['A', 'B', 'C', 'D', 'E']:
        print('-' * 80)
        SC.after(_)
        print(SC.items(), SC.isEmpty(), SC.length())
    
    ###########################################################
    
    print('-' * 80)
    print('-' * 80)
    print(SC.items(), SC.isEmpty(), SC.length())
    SCBack = [copy.deepcopy(SC) for _ in range(6)]
    
    # print(SCBack)
    
    for k, _ in enumerate(['零', '一', '二', '三', '四', '五']):
        SC = SCBack[k]
        print('-' * 80)
        SC.where(k, _)
        print(k, SC.items(), SC.isEmpty(), SC.length())
    

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CY3761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值