Python数据结构与算法:第3-6课时:单链表头部添加和在指定位置添加
在单链表尾部插入元素,尾插法
头部添加叫,头插法。
头部添加元素 add:
实现原理:
让列表头节点指向新加入元素400的地址, 400节点存放的next节点指向 100的地址。
注意:
但是有个先后顺序的问题,如果你先把400的地址(100的地址)赋给了 表头节点指向地址,那么100的地址你就会缺失了。后面的数据就都找不到了,
所以,应该先将表头指向地址(100的地址) 赋给 400节点存放的指向地址 ,然后再把400节点存放的地址 赋给 表头
实现代码:
def add(self, item):
"""头部添加节点"""
#添加的节点指向_head
node.next = self._head
# 移到链表尾部,将尾部节点的next指向node
self._head = node
我们这个代码满足当单链列表为空的情况,所以不需要考虑特殊情况。
代码验证:
class SingleNode(object):
"""单链表的结点"""
def __init__(self,item):
# _item存放数据元素
self.item = item
# _next是下一个节点的标识
self.next = None
class SingleLinkList(object):
def __init__(self,node = None):
self._head = node
def is_empty(self):
"""判断链表是否为空"""
return self._head == None
def length(self):
"""链表长度"""
# cur初始时指向头节点
cur = self._head
count = 0
# 尾节点指向None,当未到达尾部时
while cur != None:
count += 1
# 将cur后移一个节点
cur = cur.next
return count
def travel(self):
"""遍历链表"""
cur = self._head
while cur != None:
print(cur.item)
cur = cur.next
def append(self, item):
"""尾部添加元素"""
node = SingleNode(item)
# 先判断链表是否为空,若是空链表,则将_head指向新节点
if self.is_empty():
self._head = node
# 若不为空,则找到尾部,将尾节点的next指向新节点
else:
cur = self._head
while cur.next != None:
cur = cur.next
cur.next = node
def add(self, item):
"""头部添加节点"""
node = SingleNode(item)
if self.is_empty():
self._head = node
node.next = self._head
else:
#添加的节点指向_head
node.next = self._head
# 移到链表尾部,将尾部节点的next指向node
self._head = node
if __name__ == '__main__':
list = SingleLinkList()
list.append(4)
list.append(9)
list.append(8)
list.travel()
print('*******')
list.add(10)
list.travel()
4
9
8
10
4
9
8
发现完全可以实现。
在指定位置添加元素
指定位置插入参数,需要在传递一个 pos参数 ,也就是存放位置参数。
pos 是从0开始的。
头节点的位置是0。
:
def insert(self, pos, item):
"""在指定位置添加节点"""
if pos <= 0:
self.add(item)
elif pos > (self.length()-1):
self.append(item)
else:
node = Node(item)
cur = self._head
count = 0
# 移动到指定位置的前一个位置
while count < (pos-1):
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
if 和elif用于:首先排除,输入的数为不在单链表范围内的情况
语句类似于遍历的效果
node = Node(item) 语句为生成一个新的节点。
cur必须移动到,pos插入位置的前一个位置(pos-1)处,
实践验证:
class SingleNode(object):
"""单链表的结点"""
def __init__(self,item):
# _item存放数据元素
self.item = item
# _next是下一个节点的标识
self.next = None
class SingleLinkList(object):
def __init__(self,node = None):
self._head = node
def is_empty(self):
"""判断链表是否为空"""
return self._head == None
def length(self):
"""链表长度"""
# cur初始时指向头节点
cur = self._head
count = 0
# 尾节点指向None,当未到达尾部时
while cur != None:
count += 1
# 将cur后移一个节点
cur = cur.next
return count
def travel(self):
"""遍历链表"""
cur = self._head
while cur != None:
print(cur.item)
cur = cur.next
def append(self, item):
"""尾部添加元素"""
node = SingleNode(item)
# 先判断链表是否为空,若是空链表,则将_head指向新节点
if self.is_empty():
self._head = node
# 若不为空,则找到尾部,将尾节点的next指向新节点
else:
cur = self._head
while cur.next != None:
cur = cur.next
cur.next = node
def add(self, item):
"""头部添加节点"""
node = SingleNode(item)
if self.is_empty():
self._head = node
node.next = self._head
else:
#添加的节点指向_head
node.next = self._head
# 移到链表尾部,将尾部节点的next指向node
self._head = node
def insert(self, pos, item):
"""在指定位置添加节点"""
if pos <= 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
node = SingleNode(item)
cur = self._head
count = 0
# 移动到指定位置的前一个位置
while count < (pos - 1):
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
if __name__ == '__main__':
list = SingleLinkList()
list.append(4)
list.append(9)
list.append(8)
list.travel()
print('*******')
list.insert(2,2828)
list.travel()
4
9
8
4
9
2828
8
可以看到,在第二个偏移位置处插入了 新元素。