采用链表实现顺序表的规则如下:
需要两个类,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()