[英]Python Linked List - insert method
I am kinda new to DataStructure and I trying to write LinkedList, but I cannot figure out why my insert method does not work.我对 DataStructure 有点陌生,我试图编写 LinkedList,但我无法弄清楚为什么我的插入方法不起作用。 If you have any suggestions to improve, please write to me如果您有任何改进建议,请写信给我
class Node:
def __init__(self, data):
self.item = data
self.ref = None
class LinkedList:
def __init__(self):
self.start_node = None
self.index = 0
def append(self, val):
new = Node(val)
if not self.start_node:
self.start_node = new
return
last = self.start_node
while last.ref:
last = last.ref
last.ref = new
self.index += 1
def insert(self, index, value):
start_counting = 0
start = self.start_node
while start_counting < index:
start = start.ref
start_counting += 1
NewNode = Node(value)
tmp = start.ref
start = NewNode
start.ref = tmp
def display(self):
ls = []
last = self.start_node
while last:
ls.append(last.item)
last = last.ref
return ls
The insert function is replacing the current node instead of linking it.插入 function 正在替换当前节点而不是链接它。 I'll illustrate this with an example:我将用一个例子来说明这一点:
I have this linked list: 1 -> 2 -> 3 And I want to insert an element "4" in position 1 (the current number in position 1 is 2).我有这个链表:1 -> 2 -> 3 我想在 position 1 中插入一个元素“4”(position 1 中的当前数字是 2)。 The iterations will be:迭代将是:
start_counting = 0
start = self.start_node (node with value 1)
1st Iteration:第一次迭代:
start_counting < 1 -> true
start = start.ref (node with value 2)
start_counting += 1 (actual count 1)
2nd Iteration:第二次迭代:
start_counting < 1 -> false
start = (node with value 2)
After that the code continues as follows:之后代码继续如下:
We create the new Node (4 in my example) and we do:
tmp = start.ref (which is 3)
start = NewNode (we are replacing the node completely, we are not linking the node with another) <- here is the error
start.ref = tmp (which in this case is 3)
To fix the error you should take in consideration two things:要修复错误,您应该考虑两件事:
The code would be something like:代码将类似于:
def insert(self, index, value):
start_counting = 0
start = self.start_node
NewNode = Node(value)
if index == 0: # Handling the position 0 case.
NewNode.ref = start
self.start_node = NewNode
else:
while start_counting < index - 1: # Iterating until the previous node.
start_counting += 1
start = start.ref
NewNode.ref = start.ref
start.ref = NewNode
Tested with the following code and it is working:使用以下代码进行了测试,并且可以正常工作:
a = LinkedList()
a.append(1)
a.append(2)
a.append(3)
a.insert(0, 4)
a.insert(1, 5)
print(a.display())
Linked list is not indexed, so you do not need to start from index=0.链表没有索引,所以不需要从 index=0 开始。 also for linked list, there are 3 insert methods, insert_to_first,insert_to_last or insert_to_any_position.同样对于链表,有 3 种插入方法,insert_to_first、insert_to_last 或 insert_to_any_position。 You are implementing insert_to_any position.您正在实施 insert_to_any position。
def insert(self, index, value):
start_counting = 0
start = self.start_node
while start_counting < index:
start = start.ref
start_counting += 1
# so far no issue
NewNode = Node(value,None) # new Node accepts 2 args
# Let's write a linked list to visualize
# A->B->C-> adding_Node_Here ->D->E... make sure we dont lose ref to D when we inser
# after while loop, we end up start=C
NewNode.ref=start.ref # we keep the ref to D
start.ref=NewNode # now C refs to NewNode
self.index+=1 # again linked list is not indexed. "size" is better term
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.