Source code for titan_pylib.data_structures.list.linked_list

  1from typing import Generic, TypeVar, Optional, Iterator, Iterable
  2
  3T = TypeVar("T")
  4
  5
[docs] 6class LinkedList(Generic[T]): 7 """双方向連結リストです。""" 8 9 ___slots__ = ("top", "tail", "it", "_len") 10
[docs] 11 class LinkedListNode: 12 13 def __init__(self, key: T) -> None: 14 self._key = key 15 self._pre: Optional["LinkedList.LinkedListNode"] = None 16 self._nxt: Optional["LinkedList.LinkedListNode"] = None 17
[docs] 18 def key(self) -> T: 19 return self._key
20
[docs] 21 def set_key(self, key: T) -> None: 22 self._key = key
23 24 def __add__(self, _inc: int): 25 assert _inc == 1 26 return self._nxt 27 28 def __iadd__(self, _inc: int): 29 assert _inc == 1 30 return self._nxt 31 32 def __sub__(self, _dec: int): 33 assert _dec == 1 34 return self._pre 35 36 def __isub__(self, _dec: int): 37 assert _dec == 1 38 return self._pre 39 40 def __str__(self): 41 return f"LinkedList.LinkedListNode({self._key})" 42 43 __repr__ = __str__
44 45 def __init__(self, a: Iterable[T] = []): 46 self.top: Optional[LinkedList.LinkedListNode] = None 47 self.tail: Optional[LinkedList.LinkedListNode] = None 48 self._len = 0 49 for e in a: 50 self.append(e) 51
[docs] 52 def extend(self, other: "LinkedList") -> None: 53 if self.top is None: 54 self.top = other.top 55 if other.tail is not None: 56 self.tail = other.tail
57
[docs] 58 def append(self, key: T) -> LinkedListNode: 59 node = self.make_node(key) 60 self.append_iter(node) 61 return node
62
[docs] 63 def append_iter(self, node: LinkedListNode) -> None: 64 assert node._nxt is None 65 self._len += 1 66 if not self.top: 67 self.top = node 68 node._pre = self.tail 69 if self.tail: 70 self.tail._nxt = node 71 self.tail = node
72
[docs] 73 def appendleft(self, key: T) -> LinkedListNode: 74 self._len += 1 75 node = self.make_node(key) 76 if not self.tail: 77 self.tail = node 78 node._nxt = self.top 79 if self.top: 80 self.top._pre = node 81 self.top = node 82 return node
83
[docs] 84 def pop(self) -> T: 85 self._len -= 1 86 node = self.tail 87 if node._pre: 88 node._pre._nxt = node._nxt 89 else: 90 self.top = node._pre 91 self.tail = node._pre 92 return node.key()
93
[docs] 94 def popleft(self) -> T: 95 self._len -= 1 96 node = self.top 97 if node._nxt: 98 node._nxt._pre = node._pre 99 else: 100 self.tail = node._nxt 101 self.top = node._nxt 102 return node.key()
103
[docs] 104 def get_front_iter(self) -> Optional[LinkedListNode]: 105 return self.top
106
[docs] 107 def get_back_iter(self) -> Optional[LinkedListNode]: 108 return self.tail
109 110 # pos -> new_node -> pos._nxt
[docs] 111 def insert_iter_nxt( 112 self, pos_node: LinkedListNode, new_node: LinkedListNode 113 ) -> None: 114 self._len += 1 115 new_node._nxt = pos_node._nxt 116 new_node._pre = pos_node 117 if pos_node._nxt: 118 pos_node._nxt._pre = new_node 119 else: 120 self.tail = new_node 121 pos_node._nxt = new_node
122 123 # nxt._pre -> new -> nxt
[docs] 124 def insert_iter_pre( 125 self, nxt_node: LinkedListNode, new_node: LinkedListNode 126 ) -> None: 127 self._len += 1 128 if nxt_node._pre: 129 nxt_node._pre._nxt = new_node 130 else: 131 self.top = new_node 132 new_node._pre = nxt_node._pre 133 new_node._nxt = nxt_node 134 nxt_node._pre = new_node
135
[docs] 136 def remove_iter(self, node: LinkedListNode) -> None: 137 self._len -= 1 138 if node._pre: 139 node._pre._nxt = node._nxt 140 else: 141 self.top = node._nxt 142 if node._nxt: 143 node._nxt._pre = node._pre 144 else: 145 assert self.tail is node 146 self.tail = node._pre
147
[docs] 148 def iter_node(self) -> LinkedListNode: 149 node = self.top 150 while node: 151 nxt = node._nxt 152 yield node 153 node = nxt
154
[docs] 155 def iter_node_rev(self) -> LinkedListNode: 156 node = self.tail 157 while node: 158 pre = node._pre 159 yield node 160 node = pre
161 162 def __reversed__(self) -> Iterator[T]: 163 node = self.tail 164 while node: 165 pre = node._pre 166 yield node.key() 167 node = pre 168
[docs] 169 def tolist(self) -> list[T]: 170 return [x for x in self]
171
[docs] 172 def make_node(self, key: T) -> LinkedListNode: 173 return self.LinkedListNode(key)
174 175 def __iter__(self) -> Iterator[T]: 176 self.it = self.top 177 return self 178 179 def __len__(self): 180 return self._len 181 182 def __next__(self) -> T: 183 if self.it is None: 184 raise StopIteration 185 key = self.it.key() 186 self.it += 1 187 return key 188 189 def __str__(self): 190 return str(self.tolist()) 191 192 def __repr__(self): 193 return f"{self.__class__.__name__}({self})"