1 # encoding=utf-8 2 3 4 class SingleLinkList(object): 5 """ 6 单向链表, 各节点类型不限 7 """ 8 class Node(object): 9 """ 10 节点域, 存放ele & next 11 """ 12 def __init__(self, ele): 13 self.ele = ele 14 self.next = None 15 16 def __str__(self): 17 return str(self.ele) 18 19 def __init__(self, ele=None): 20 self.__head = None 21 if ele is not None: 22 self.__head = self.Node(ele) 23 24 @property 25 def is_empty(self): 26 """ 27 the single_link_list == empty 28 :return: bool 29 """ 30 return self.__head is None 31 32 @property 33 def length(self): 34 """ 35 the length of the single_link_list 36 :return: length 37 """ 38 count = 0 39 for _ in self.travel(): 40 count += 1 41 return count 42 43 def travel(self): 44 """ 45 迭代遍历 46 :return: current node 47 """ 48 cur = self.__head 49 while cur: 50 yield cur 51 cur = cur.next 52 53 def add(self, ele): 54 """ 55 头插法 56 :param ele: element 57 :return: None 58 """ 59 node = self.Node(ele) 60 node.next, self.__head = self.__head, node 61 62 def append(self, ele): 63 """ 64 尾插法 65 :param ele: 66 :return: 67 """ 68 node = self.Node(ele) 69 if not self.__head: 70 self.__head = node 71 return 72 cur = self.__head 73 while cur.next: 74 cur = cur.next 75 cur.next = node 76 77 def insert(self, idx, ele): 78 """ 79 insert into single_link_list by index 80 :param idx: index 81 :param ele: element 82 :return: 83 """ 84 if idx <= 0: 85 self.add(ele) 86 return 87 if idx >= self.length: 88 self.append(ele) 89 return 90 node = self.Node(ele) 91 count, cur = 0, self.__head 92 while count < idx - 1: 93 count, cur = count + 1, cur.next 94 node.next, cur.next = cur.next, node 95 96 def del_by_index(self, idx): 97 """ 98 delete from single_link_list by index 99 :param idx: index 100 :return: 101 """ 102 if idx < 0 or idx >= self.length: 103 return 104 if idx == 0: 105 self.__head = self.__head.next 106 return 107 count, cur = 0, self.__head 108 while count < idx - 1: 109 count, cur = count + 1, cur.next 110 drop = cur.next 111 cur.next = cur.next.next 112 del drop 113 114 def remove(self, ele): 115 """ 116 remove from single_link_list by element 117 :param ele: element 118 :return: 119 """ 120 if self.is_empty: 121 return 122 if self.__head.ele == ele: 123 self.__head = self.__head.next 124 return 125 cur, per = self.__head, None 126 while cur and cur.ele != ele: 127 per, cur = cur, cur.next 128 if cur: 129 per.next = cur.next 130 del cur 131 132 def alter(self, idx, ele): 133 """ 134 update element from single_link_list by index 135 :param idx: index 136 :param ele: new element 137 :return: 138 """ 139 if idx < 0 or idx >= self.length: 140 return 141 count, cur = 0, self.__head 142 while count != idx: 143 count, cur = count + 1, cur.next 144 cur.ele = ele 145 146 def get(self, idx): 147 """ 148 get an element by index 149 :param idx: index 150 :return: element type of Node 151 """ 152 if idx < 0 or idx >= self.length: 153 return 154 count, cur = 0, self.__head 155 while count != idx: 156 count, cur = count + 1, cur.next 157 return cur 158 159 def search(self, ele): 160 """ 161 get an element from single_link_list by element 162 :param ele: element 163 :return: element type of Node 164 """ 165 count, cur = 0, self.__head 166 while cur and cur.ele != ele: 167 count, cur = count + 1, cur.next 168 return count if cur else -1 169 170 @property 171 def get_mid_node(self): 172 """ 173 快慢指针找中间节点 174 :return: 175 """ 176 fast = self.__head 177 slow = self.__head 178 while fast.next is not None: 179 if fast.next.next is not None: 180 fast = fast.next.next 181 slow = slow.next 182 else: 183 fast = fast.next 184 return slow
浙公网安备 33010602011771号