目录
数组的缺点
链表
单向链表
双向链表
Python链表的实现
手写链表
数组的缺点
1)需要占用连续的空间
若某个数组很大,可能没有这么大的连续空间给它用。
2〉不方便删除和插入
例如删除数组中间的一个数据,需要把后面所有的数据往前挪填补这个空位,产生大量的拷贝开销。中间插入数据,也同样不方便操作。
链表
- “链表”能解决上述问题
- 不需要把数据存储在连续的空间上
- 删除和增加数据都很方便
- 链表可以看成是用指针串起来的数组,它用一串位于任意位置的存储单元存线性表的数据元素,这些存储单元可以是连续的,也可以不连续。
单向链表
单向链表中,指针是单向的,只能从左向右单向遍历数据。比较特殊的是头和尾,为了方便从任何一个位置出发能遍历到整个链表,让首尾相接,尾巴tail的next指针指向头部head的data。由于首尾相接的链表是循环的,所以任意结点都可以成为头和尾。
双向链表
每个结点有两个指针,pre指针指向前一结点,next指针指向后一结点。双向链表也是首尾相接,最后结点的next指针指向第一个结点,第一个结点的pre指针指向最后的结点。
Python链表的实现
Python的列表list,可以当成链表使用,可以当成队列、栈使用,可以当成数组。
#初始化
li = [ 11,24,3,4,5,6,5];#在末尾添加61
li.append(61);print(li)#统计5的个数
print(li.count(5))#在5前面插入49
index =li.index( 5); li.insert( index ,49); print(li)#在5后面插入51
index =li.index( 5); li.insert( index+1,51);print(li)#找到3,删副除3
index=li.index( 3);li.pop( index);print(li)#删除第一个5
li.remove(5);print(li)
例题
自行车停放lanqiao0J题号1518
【题目描述】
有n辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的身辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车,从左到右编号为: 3,5,1。现在编号为2的穿4辆自行车要停在5号自行车的左边,所以现在停车机里的自行车编号是:3,2,5, 1)。给定n辆自行车的停放情况,按顺序输出最后停车棚里的自行车编号。n≤100000。
【输入描述】
第一行一个整数n。第二行一个整数x。表示第一辆自行车的编号。以下n-1行,每行3个整数x, y,z。z =0时,表示编号为x的自行车恰停放在编号为y的自行车的左边。 z=1时,表示编号为x的自行车恰停放在编号为y的自行车的右边。
【输出描述】
从左到右输出停车棚里的自行车编号。
答案
n = int( input( ))
a = int( input( ))
bicycles = []
#空链表
bicycles.append(a)
for i in range(n-1):
x,y,z = map(int,input( ).split( ))
if z==0: bicycles.insert(bicycles.index(y ),x)
else: bicycles.insert(bicycles.index(y)+1,x)
for i in bicycles:print(i,end=' ')
手写链表
class Node () :
def __init__(self, data):
self.data = data
self.next = None
class SingleLinkList():
def _init_(self,node = None):
self._head = node
def left_insert(self,x, y): #左插入
pre = self._head
while pre.next.data != x: pre = pre. next
node = Node(y)
node.next = pre. next
pre. next = node
def right_insert(self, x,y): #右插入
pre = self._head
while pre.data !=x: pre = pre.next
node =Node(y)
node.next =pre. next
pre.next = node
def print_list(self): #打印链表
cur = self._head
while cur != None:
print (cur.data,end='')
cur = cur. next
n = int(input())
a = int(input())
node = Node(a)
li = SingleLinkList(node)
for i in range(n-1):
x,y,z = map( int, input().split())
if z==0: li.left_insert(y,x)
else: li.right_insert(y,x)
li.print_list()
【题目描述】
设有n个人围坐在圆桌周围,现从某个位置k上的人开始报数,报数到m的人就站出来。下一个人,即原来的第m+l个位置上的人,又从1开始报数,再报数到m的人站出来。依次重复下去,直到全部的人都站出来为止。试设计一个程序求出这n个人的出列顺序。
【输入描述】
输入只有一行且为用空格隔开的三个正整数n, k, m,其含义如上所述。
【输出描述】
共n行,表示这n个人的出列顺序。
n,k,m = map( int,input( ).split())
a= list( range( 1,n+1))
i = k-1
while len(a)>0:
i = ( i+m-1)%len(a)
print(a.pop(i))