算法创作|单链表的基本操作

问题描述

单链表是链表的一种,是一种链式存取的数据结构。用一组地址任意的存储单元存放线性表中的数据元素,链表中的数据是以结点(node)来表示的,每个结点的构成包括数据域(date)和指针域(next)两个部分,数据域里存储的是当前结点的数据,指针域能得到该结点的下一结点。

单链表的特点是链表的连接方向是单向的,对链表的访问要通过顺序读取从头部开始。

【图1】

它的优点是可以克服顺序线性表需要预先知道数据大小的缺点,充分利用内存空间,实现灵活的内存动态管理;同时数据元素不需要按顺序存储,还方便进行插入、删除等操作;缺点是查找某个特定结点时速度比顺序存储慢,而且增加了结点的指针域,空间开销较大。

解决方案

例(1):结点P的赋值操作:

【图2】

则p. data=10    p.next=q

q. data=20   q. next=None

【图1】中,若P=n2,则P和n2等价;若P=P. next,则P就移动到了n3。

即:p=head

p=p. next=n1

p=p. next=n2

……

例(2):结点P的移动:

若P的初始位置为head,要让P移动到第i个结点,则:

p=head

for k in range (i):

p=p. next

此时P为单链表的第i个结点。

若P的初始位置在head,让P指向单链表的最后一个结点,则:

p=head

while p != None :

p=p. next

print (p.data)

此时P为None。

例(3):单链表的插入算法:包括尾插法、前插法、任意位置插入法。重点为前两个。

○尾插法:若当前链表尾结点为P,新插入q结点,则 p. next=q , q. next=None。如果让P仍为尾结点,则p=p. next。

○头插法:

若只知头结点head,在头结点和第一个结点之间新插入结点q,则:

q. next=head. next

head.next=q

(先安排q后面的结点,再安排q前面的结点)

例(4):删除操作:

设P为链表的第i-1个结点,删除第i个结点,则:

p. next=p. next.next

例(5):合并操作:

设法实现两个单链表的合并操作,则:

p=head1

while p. next !=None :

p=p. next

p. next = head2. next

(链表1的最后一个结点的next为链表2的第一个结点)

结语

本文主要围绕单链表的定义、特点、优缺点、符号表示、以及基本操作(赋值、移动、插入、删除、合并)等问题展开,进行了初步的基础学习。我们发现这些代码易看懂但不易自己写出来,有些眼高手低纸上谈兵,知识掌握不全面且不熟练,希望下次能有所进步。

实习编辑:衡辉

作者:钟妍、杨月涵、欧恒丽

(0)

相关推荐