• Python链表


      1 class Node:
      2     '''
      3     节点类
      4     链表节点结构  data    next
      5     data: 节点保存的数据
      6     _next: 保存下一个节点对象
      7     '''
      8 
      9     def __init__(self, data, pnext=None):
     10         self.data = data
     11         self._next = pnext
     12     #
     13     # def __str__(self) -> str:
     14     #     """
     15     #     输出节点的信息
     16     #     :return: self.data
     17     #     """
     18     #     return str(self.data)
     19 
     20     def __repr__(self) -> str:
     21         return str(self.data)
     22 
     23     # def  _getindex(self):
     24     #     return Link_list()
     25 
     26 class Link_list:
     27     """
     28     链表类:
     29         属性: 1.链表头head  2.链表长度
     30         方法: 1.是否为空 isEmpty 2.增加 append 3.删除节点 delete 4.修改(更新)节点 update
     31               5.查找节点 getNode  6.获取节点的索引 getIndex  7.插入 insert  8.清空链表clear
     32      """
     33 
     34     def __init__(self) -> None:
     35         """
     36         初始化链表,head信息为空,长度为0
     37         """
     38         self._head = None
     39         self._length = 0
     40 
     41     def isEmpty(self):
     42         """
     43         判断链表是否为空
     44         :return:
     45         """
     46         return self._length == 0
     47 
     48     def append(self, item):
     49         """
     50 
     51         :param item: Node 或者 node的data信息
     52         :return: None
     53         """
     54         if not isinstance(item,Node):
     55             item = Node(data=item)
     56         if not self._head:
     57             # head为Node对象
     58             # head --->  data + nextNode
     59             self._head = item
     60             self._length += 1
     61         else:
     62             # 取到当前的Node对象
     63             _node = self._head
     64             # 如果不是最后一个节点则一直往下找
     65             while _node._next:
     66                 _node = _node._next
     67             # 将新的节点赋值给最后一个的_next属性
     68             _node._next = item
     69             self._length += 1
     70 
     71     def delete(self,index):
     72         """
     73         根据索引删除节点
     74         :param index: 索引
     75         :return: bool
     76         """
     77         if  not isinstance(index,int):
     78             raise TypeError("index应该为int类型")
     79         if self.isEmpty():
     80             print("当前链表为空")
     81             return False
     82         if index<0 or index>=self._length:
     83             print("输入的索引不正确")
     84             return False
     85         elif index==0:
     86             self._head=self._head._next
     87             self._length-=1
     88             return  True
     89         elif index==self._length-1:
     90             _node = self._head
     91             # 如果不是最后一个节点则一直往下找
     92             for i in range(index):
     93                 _node = _node._next
     94             _node._next=None
     95             self._length-=1
     96             return True
     97         else:
     98             _node = self._head
     99             for j in range(index-1):
    100                 _node = _node._next
    101             _node._next=_node._next._next
    102             self._length-=1
    103             return True
    104 
    105     def pop(self,index):
    106         """
    107         根据索引删除节点,并返回
    108         :param index: 索引
    109         :return: bool
    110         """
    111         if  not isinstance(index,int):
    112             raise TypeError("index应该为int类型")
    113         if self.isEmpty():
    114             print("当前链表为空")
    115             return False
    116         if index<0 or index>=self._length:
    117             print("输入的索引不正确")
    118             return False
    119         elif index==0:
    120             _node = self._head
    121             self._head=self._head._next
    122             self._length-=1
    123             return  _node
    124         elif index==self._length-1:
    125             _node = self._head
    126             # 如果不是最后一个节点则一直往下找
    127             for i in range(index):
    128                 _node = _node._next
    129             __node = _node._next
    130             _node._next=None
    131             self._length-=1
    132             return __node
    133         else:
    134             _node = self._head
    135             for j in range(index-1):
    136                 _node = _node._next
    137             __node = _node._next
    138             _node._next=_node._next._next
    139             self._length-=1
    140             return __node
    141 
    142     def getNode(self,index):
    143         """
    144         根据index得到节点
    145         :param index: 索引
    146         :return: Node对象
    147         """
    148 
    149         if not isinstance(index, int):
    150             raise TypeError("index应该为int类型")
    151         if self.isEmpty():
    152             print("当前链表为空")
    153             return False
    154         if index < 0 or index >= self._length:
    155             print("输入的索引不正确")
    156             return False
    157         _node = self._head
    158         for i in  range(index):
    159             _node = _node._next
    160         return _node
    161 
    162     def update(self,index,data):
    163         """
    164         更新节点
    165         :param index: 索引
    166         :param data: 节点信息
    167         :return: 返回修改后的节点
    168         """
    169         if not isinstance(index, int):
    170             raise TypeError("index应该为int类型")
    171         if self.isEmpty():
    172             print("当前链表为空")
    173             return False
    174         if index < 0 or index >= self._length:
    175             print("输入的索引不正确")
    176             return False
    177         _node = self._head
    178         for i in range(index):
    179             _node = _node._next
    180         _node.data = data
    181         return _node
    182 
    183 
    184     def getIndex(self,node):
    185         """
    186         根据节点得到节点索引
    187         :param node:节点
    188         :return:index
    189         """
    190         if isinstance(node, Node):
    191             for i in range(self._length):
    192                 if node is self.getNode(i):
    193                     return i
    194             print("node异常")
    195             return
    196         else:
    197             raise  TypeError("类型不正确")
    198 
    199     def insert(self,index,item):
    200         if not isinstance(item, Node):
    201             item = Node(data=item)
    202         if  not isinstance(index,int):
    203             raise TypeError("index应该为int类型")
    204         if index<0 or index>=self._length:
    205             print("输入的索引不正确")
    206             return False
    207         if index==0:
    208             old_next = self._head
    209             item._next= old_next
    210             self._head=item
    211             self._length+=1
    212 
    213         else:
    214             _node = self._head
    215             for i in  range(index-1):
    216                 _node = _node._next
    217             old_next = _node._next
    218             _node._next = item
    219             item._next = old_next
    220             self._length += 1
    221         return True
    222 
    223     def  clear(self):
    224         self.head = None
    225         self.length = 0
    226         return True
    227 
    228     def printl(self):
    229         for i in  range(self._length):
    230             print(self.getNode(i))
  • 相关阅读:
    编程练习--判断两个数组中数据的数据类型是否相同
    JS 类型检测
    JS学习笔记 等于和包装对象
    HTML5经典案例学习-----新元素添加文档结构
    JZ2440存储管理器--SDRAM
    GPIO实验之c语言
    1- 裸机开发GPIO
    Java基础教程——数组
    Java基础教程——运算符
    结构化编程·图示
  • 原文地址:https://www.cnblogs.com/twotigers/p/8548527.html
Copyright © 2020-2023  润新知