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