Dataclasses:
@dataclass
class Node:
value: int = None
nxt: Any = None
@dataclass
class Deque:
head: Node = None
tail: Node = None
size: int = 0
The values:
self.head = Node(value=19, nxt=Node(value=18, nxt=Node(value=17, nxt=Node(value=16, nxt=Node(value=15, nxt=Node(value=14, nxt=Node(value=13, nxt=Node(value=12, nxt=Node(value=11, nxt=Node(value=1, nxt=Node(value=2, nxt=Node(value=3, nxt=Node(value=4, nxt=Node(value=5, nxt=Node(value=6, nxt=Node(value=7, nxt=Node(value=8, nxt=Node(value=9, nxt=Node(value=10, nxt=None)))))))))))))))))))
self.tail = Node(value=10, nxt=None)
I want to remove the tail from the head with the following function:
def remove_last(self):
if self.tail is None:
return str(None)
else:
_node = self.head
_remove = self.tail
print(_remove)
So i get the result:
self.head = Node(value=19, nxt=Node(value=18, nxt=Node(value=17, nxt=Node(value=16, nxt=Node(value=15, nxt=Node(value=14, nxt=Node(value=13, nxt=Node(value=12, nxt=Node(value=11, nxt=Node(value=1, nxt=Node(value=2, nxt=Node(value=3, nxt=Node(value=4, nxt=Node(value=5, nxt=Node(value=6, nxt=Node(value=7, nxt=Node(value=8, nxt=Node(value=9, None))))))))))))))))))
In order to remove the tail from your dequeue, you need to clear the nxt
attribute from its second-last entry. Since your Node
s are uni-directional, you need to first find that second-last one. I also called it pop
and made it return the item that was removed, since that is the usual data-structure-pattern, and added some more stuff in order to have something that could actually be shown:
# importing this makes it possible to do self-referential type annotation in `Node`
from __future__ import annotations
from dataclasses import dataclass
from typing import Optional
@dataclass
class Node:
value: int
nxt: Optional[Node] = None
@dataclass
class Deque:
head: Optional[Node] = None
tail: Optional[Node] = None
size: int = 0
def add(self, node: Node):
if self.size == 0:
self.head = self.tail = node
self.size = 1
else:
node.nxt = self.head
self.head = node
self.size += 1
def pop(self) -> Node:
if self.size == 0:
raise ValueError("Deque is empty.")
if self.size == 1:
old_tail = self.tail
self.head = self.head.next = self.tail = None
else:
current = self.head
while current.nxt is not self.tail:
current = current.nxt
old_tail = current.nxt
self.tail = current
current.nxt = None
self.size -= 1
return old_tail
Demonstration:
>>> dq = Deque()
>>> dq.add(Node(0))
>>> dq.add(Node(1))
>>> dq.add(Node(2))
>>> dq
Deque(head=Node(value=2, nxt=Node(value=1, nxt=Node(value=0, nxt=None))), tail=Node(value=0, nxt=None), size=3)
>>> dq.pop()
Node(value=0, nxt=None)
>>> dq
Deque(head=Node(value=2, nxt=Node(value=1, nxt=None)), tail=Node(value=1, nxt=None), size=2)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.