采用链表实现顺序表的规则如下:
需要两个类,LNode只有两个变量 elem是保存的元素,next是下一个元素的内存地址, LList类处理增删改查等操作
只写了 增加元素的代码,删除修改类似。
增加元素
增加元素分为首部,尾部,任意位置三种,
首部,首先判断head是否为空,head不为空时将新加的元素的next 指向 原head的内存地
尾部,需要通过扫描找到左后一个元素(next为None的),直接将最后一个元素的next指向新加入的元素所在的内存地址
任意位置,例如A,B两个元素的计数分别为5,6(从0开始计数),现要将A和B之间插入一个C元素。示例图如下:
修改元素:
首部:如果只有一个一个则直接替换,如果大于1则将原首部的next设为None, 将新加元素的next设为下一个元素的内存地址
尾部:如果只有一个一个则直接替换,如果大于1则将 i-1 个元素的next指向新加入元素的内存地址 (i为索引的最大值)
任意位置:加入只有A,B,C三个元素,现在用D元素替换掉B元素。将A的next指向D的内存地址,B的next设置None, D的next指向C的内存地址
删除元素:
首部:新的head为原首部的next,原首部的next设为None。
尾部:先扫描元素找到倒数第二个元素 将 i - 1 的next设为None即可(i为最大元素值)
任意位置:先判断替换索引值是否合法,例如A,B,C三元素要去除B,扫描找到位置后,将A的next指向C的内存地址,B的next设为None
# -*- coding: utf-8 -*-
class LNode():
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_
class LLlist():
def __init__(self):
self.head = None
def is_empty(self):
return self.head == None
def count(self):
# 计数
count = 1
current = self.head
while current.next != None:
count += 1
current = current.next
return count
def h_add(self, elem):
"""
向头部添加
分三步:1、将新的值elem 加入结点,2、将新的指针指向原head,3、self.head值更新为新的结点
"""
current = LNode(elem)
if self.is_empty():
self.head = current
else:
current.next = self.head
self.head = current
def insert(self, index, elem):
"""
任意位置插入
index:索引
elem:插入元素
列:A,B为两个相邻元素对应索引为0,1, C为要插入元素
分步:1、A.next = C所在内存空间的地址。2、C.next = B位置所在的内存地址
"""
if index < 0 or index > self.count() - 1:
raise IndexError('插入的位置不合法!')
current = self.head
add = LNode(elem)
num = 0
while current.next != None:
if num == index - 1:
up = current.next
current.next = add
num += 1
if index == num:
add.next = up
break
current = current.next
def travel(self):
current = self.head
while current != None:
print current.elem
current = current.next
def h_end(self, elem):
# 向尾部添加
current1 = LNode(elem)
current2 = self.head
if self.head == None:
self.head = current1
else:
while current2.next != None:
current2 = current2.next
current2.next = current1
a = LLlist()
for x in range(1,3):
a.h_add(x)
a.h_end(200)
a.h_add('aaa')
a.insert(2,300)
a.travel()