对--「数据结构与算法 2」| 单链表其实真的很简单。--的一些补充。

本文纠正了关于单链表头节点与头指针的常见误解,详细解析了头节点的作用,避免列表首节点无法删除的问题,并提供修改后的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址: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)    

在此,要感谢原文作者的深刻讲解和慷慨分享。同时也欢迎大家来找茬,??。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nobrody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值