对于数据结构的头结点、头指针问题,一直都有点不太清楚理解。现对其中涉及的概念与如何使用python语言创建链表(带有头结点与不带头结点)进行解释。
一、基本概念
假设我们将对数组array[a1,a2,a3]创建链表结果,两种存储方式如下图所示:
概念小结:
1)对一个链表结构,头指针是必须存在的,其实就是链表名称,指向的是链表的第一个节点的指针(可以是头结点也可以是首元节点,看实现方式)。
2)当链表头结点存在的时候,它是是链表的第一个节点,指向首元节点(首元节点存储数据a1)。头结点的数据域可以不存储任何信息,设置为None.
二、代码实现
''''结点类LNode——有无头节点该部分代码不变'''
class LNode:
# 结点结构
def __init__(self,data=None,next_=None):
self.data = data
self.next = next_
2.1 创建无头结点的链表实现
''''单链表对象LList的类——无头节点'''
class LList(object):
# 定义一个空表,_head命名作为对象的内部表示,不希望外部使用
def __init__(self):
self._head = None
# 后端操作,在链表的最后插上元素
def append(self,data):
p = self._head
# 当链表是空表的时候
if self._head is None:
self._head = LNode(data)
return
# 注意这是p.next不是空,这样p才是最后存在的结点
while p.next is not None:
p = p.next
# 先遍历到最后元素,这里需要last_p得到返回的是引用类型
p.next = LNode(data)
# 遍历链表结点——有无头结点这个代码一样
def traverse(self):
p = self._head
while p is not None:
print(p.data,'#')
p = p.next
# 最后p是None值
# 创建无头结点的链表
array = [1,2,3]
l = LList()
for item in array:
l.append(item)
# 遍历输出
l.traverse()
'''
最后遍历节点输出结果为:
1 #
2 #
3 #
'''
2.2 创建带有头结点的链表实现
''''单链表对象HeadNodeLList的类——带有头节点'''
class HeadNodeLList(object):
# 定义一个空表,_head命名作为对象的内部表示,不希望外部使用
def __init__(self):
self._head = None
# 后端操作,在链表的最后插上元素
def append(self,data):
p = self._head
# 当链表是空表的时候
if self._head is None:
# 创建头结点——这是区别于不带头结点的地方
self._head = LNode()
self._head.next = LNode(data)
return
# 注意这是p.next不是空,这样p才是最后存在的结点
while p.next is not None:
p = p.next
# 先遍历到最后元素,这里需要last_p得到返回的是引用类型
p.next = LNode(data)
# 遍历链表结点——有无头结点这个代码一样
def traverse(self):
p = self._head
while p is not None:
print(p.data,'#')
p = p.next
# 最后p是None值
# 创建有头结点的链表
array = [1,2,3]
head_node_l = HeadNodeLList()
for item in array:
head_node_l.append(item)
# 遍历输出
head_node_l.traverse()
'''
带有头节点的链表遍历节点输出结果为:
None #
1 #
2 #
3 #
'''