// 运行于python3.7classLNode(object):
def __init__(self, data = None, previous = None, next = None):
self.data = data
self.previous = previous
self.next = next
classLList(object):
def __init__(self):
head =LNode()
tail =LNode()
self.head = head
self.tail = tail
self.head.next = self.tail
self.tail.previous = self.head
# 链表长度
def _len(self):
length =0
p = self.head
while p.next != self.tail:
length +=1
p = p.next
return length
# 遍历链表
def iter(self):
p = self.head
while p != self.tail.previous:
p = p.next
print(p.data, end=' ')
# 在末尾添加节点
def append(self, item):
node =LNode(item)
p = self.tail.previous
p.next = node
node.previous = p
self.tail.previous = node
node.next = self.tail
# 获取节点
def getitem(self, index):
length = self._len()
index = index if index >=0else length + index
if index >= length or index <0:return"超出范围"
p = self.head.next
while index:
p = p.next
index -=1return p.data
# 将第index号节点数据设为item
def setitem(self, index, item):
index = index if index >=0else index + self._len()if index <0 or index > self._len():return"超出范围"
p = self.head.next
while index:
p = p.next
index -=1
p.data = item
return self.getitem(index)
# 在第index号出插入一个新的节点item
def insert(self, index, item):
index = index if index >=0else index + self._len()
node =LNode(item)
p = self.head
while index:
p = p.next
index -=1
p.next.previous = node
node.next = p.next
p.next = node
node.previous = p
# 删除index出的节点,并返回给节点的值
def delete(self, index):if index >=0 and index < self._len():
p = self.head.next
while index:
p = p.next
index -=1
data = p.data
p.previous.next = p.next
p.next.previous = p.previous
return data
elif index >-(self._len()) and index <0:
p = self.tail
while index <0:
p = p.previous
index +=1
txt = p.data
p.previous.next = p.next
p.next.previous = p.previous
return txt
else:return'超出范围'
# 反转链表
def reverse(self):if self.head.next == self.tail or self.head.next.next == self.tail:return
p = self.head
while p != None:
p.previous, p.next = p.next, p.previous
p = p.previous
self.head, self.tail = self.tail, self.head
# 清空链表
def clear(self):
self.head.next = self.tail
self.tail.previous = self.head
def main():
l =LList()for i inrange(1,10,2):
l.append(i)print('链表长度为:', l._len())print('遍历链表:')
l.iter()print('\n0号位置的数据为:', l.getitem(0))print('1号位置的数据为:', l.getitem(1))print('2号位置的数据为:', l.getitem(2))print('3号位置的数据为:', l.getitem(3))print('4号位置的数据为:', l.getitem(4))print('5号位置的数据为:', l.getitem(5))print('-1号位置的数据为:', l.getitem(-1))print('-3号位置的数据为:', l.getitem(-3))print('0号位置数据重置为:', l.setitem(0,0))print('遍历链表:')
l.iter()
l.insert(0,1)print('\n在0号位置插入数据后遍历链表:')
l.iter()print('\n1号位置的数据为:', l.getitem(1))print('链表长度为:', l._len())
l.insert(6,11)print('在6号位置插入数据后遍历链表:')
l.iter()
l.insert(3,4)print('\n在3号位置插入数据后遍历链表:')
l.iter()print('\n删除掉的数据为:', l.delete(1))print('删除1处的节点后遍历链表:')
l.iter()print('\n删除掉的数据为:', l.delete(-1))print('删除-1处的节点后遍历链表:')
l.iter()
l.reverse()print('\n反转后的链表为:')
l.iter()print("\n清空链表")
l.clear()if __name__ =='__main__':main()