原文地址:https://blog.youkuaiyun.com/u013486414/article/details/83099153#comments
作者的理论解释部分清晰易懂,对概念讲解的很透彻,但是作者的代码在实测时出现了以下问题:
(1)头节点与头指针混淆。
(2)头节点与列表的第一个结点重合,导致列表的第一个结点无法被删除。
在代码中直接作出如下修改:
def InitList(self,data):
#self.head = Node(data[0]) # 头结点 ==>> 不能对头节点进行赋值操作,头节点是指向链表第一个结点而不是成为链表第一个结点。
p = self.head # 头指针
for i in data[1:]: ==>> for i in data:
node = Node(i)
p.next = node
p = p.next
原作者在定义头节点之后,在根据data生成LinkList时,改变了头节点直接令其成为链表中的第一个结点,带来的唯一问题就是导致链表的第一个结点无法被删除,同时头节点失去了原来的意义。指向链表中第一个结点,而不是让其成为链表的第一个结点。
# 单链表的插入(在第 s 个结点后面插入 data)
def InsertList(self,s,data):
if self.IsEmpty() or s < 0 or s > self.LengthList():
print("Insert failed!")
return
p = self.head
index = 1 =========>>>>>>>>> index=0,意思是从头节点开始,既然定义了头节点,那就应该让它发挥作用。
while index < s:
p = p.next
index += 1
node = Node(data)
node.next = p.next
p.next = node
同理,在DeleteList()函数中,索引也要从0开始。
修改后的完整代码如下:
class Node(object):
def __init__(self,data):
self.data=data
self.next=None
class LinkList(object):
def __init__(self):
self.head=Node(None)
def IsEmpty(self):
p=self.head
if p.next==None:
print "List is Empty"
return True
return False
def PrintList(self):
if self.IsEmpty():
return False
p=self.head
while p:
print p.data,' '
p=p.next
def InitList(self,data):
#self.head=Node(data[0])
p=self.head
print "The head of the List is ",p.data
for i in data:
node=Node(i)
p.next=node
p=p.next
def LengthList(self):
if self.IsEmpty():
return -1
p=self.head
cnt=0
while p:
cnt+=1
p=p.next
return cnt
def InsertList(self,s,data):
if self.IsEmpty() or s<0 or s>self.LengthList():
print "Insert failed"
return -1
p=self.head
index=0
while index<s:
p=p.next
index+=1
node=Node(data)
node.next=p.next
p.next=node
def DeleteList(self,s):
if self.IsEmpty() or s<0 or s>self.LengthList():
print "Delete failed"
return -1
p=self.head
pre=self.head
index=0
while index < s:
pre=p
index+=1
p=p.next
pre.next=p.next
p=None
def GetList(self,s):
if self.IsEmpty() or s < 0 or s>self.LengthList():
print "Read Failed !"
return -1
p=self.head
index=0
while index < s:
index += 1
p=p.next
print "The value of {} is {}".format(s,p.data)
在此,要感谢原文作者的深刻讲解和慷慨分享。同时也欢迎大家来找茬,??。