蓝桥杯丨单链表

简介: 蓝桥杯丨单链表

前言

本文主要介绍有关单链表的基本操作,包括但不限于创建一个单链表、单链表的遍历、单链表的插入操作以及单链表的删除操作,Python中并不存在指针,本章主要通过列表实现模拟指针的方法来实现链表以及用类方法实现单链表。

模拟指针

1. 单链表的创建

创建一个单链表需要运用两个列表,其中一个列表用来存储链表中的每一个元素,另一个链表用来存储它们的指针,创建单链表算法如下:

ListValue=[1,5,6,2,4,3]
ListPointer=[3,2,-1,5,1,4]

第一个列表保存了链表中的每一个元素,头指针为0,第一个元素是1,表示1的数据域,与1下标相同的在另一个列表中的元素是3,这个表示元素1的指针域,我们回到第一个列表,找下标为3的元素,是2,代表元素2的数据域,而和元素二下标(3)相同的在另一个列表中的元素是5,表示2的指针域,指向了3,依次循环直到某个元素的指针域为-1  

2. 单链表的遍历

单链表的遍历算法如下:

ListValue=[1,5,6,2,4,3]
ListPointer=[3,2,-1,5,1,4]
head=0
next=head
while next!=-1:
    print(ListValue[next])
    next=ListPointer[next]

首先初始化头结点,然后开始循环遍历,每次打印数据域,然后让指针指向下一个元素即可

3. 单链表的插入

单链表的插入算法如下:

ListValue=[1,4,5,2]
ListRight=[3,2,-1,1]
head=0  
num=3                                             (1)
next,last=head,head                               (2)
def Output():                                  
    next=head
    while next!=-1:
        print(ListValue[next],end=' ')
        next=ListRight[next]
    print()
Output()
while ListValue[next]<=num and next!=-1:          (3)
    last=next                                     
    next=ListRight[next]
ListValue.append(num)                             (4)
ListRight.append(ListRight[last])                 (5)
ListRight[last]=len(ListValue)-1                  (6)
Output()

(1)要插入的元素

(2)初始化插入位置的下一个元素和上一个元素的指针

(3)找到要插入的位置

(4)将插入元素放在列表最后

(5)获得插入元素的指针域

(6)将原来位置的指针域指向插入元素,完成插入操作

4. 单链表的删除

单链表的删除算法如下:

ListValue=[1,5,6,2,7,3]
ListRight=[3,2,4,5,-1,1]
head=0
prepos=5                                           (1)
ListRight[prepos]=ListRight[ListRight[prepos]]     (2)

(1)找到要删除元素的前一个元素的指针域

(2)让其指针域直接指向要删除元素后一个元素即可

类方法

1. 创建结点

#创建一个结点

class LNode:

   def __init__(self,data):

       self.data=data

       self.next=None

2. 头结点

#头结点

head=LNode(0)

3. 创建一个单链表

#创建一个单链表

def create(n):

   head=LNode(0)

   tail=head

   for i in range(n):

       data=int(input())

       new=LNode(data)

       tail.next=new

       tail=new

   return head


4. 求单链表长度

#求链表长度

def lenth(head):

   n=0

   p=head.next

   while p:

       p=p.next

       n+=1

   return n

5. 遍历单链表

#遍历单链表

def printf(head):

   p=head.next

   while p:

       print(p.data,end=' ')

       p=p.next

6. 插入

#插入

def insert(head,pos,val):

   if pos<1 or pos>lenth(head)+1:

       return 0

   p=head

   i=0

   while i<pos-1 and p:

       p=p.next

       i+=1

   new=LNode(val)

   new.next=p.next

   p.next=new

   return 1


7. 删除

#删除

def pop(head,pos):

   p=head

   if pos<1 or pos>lenth(head):

       return 0

   i=0

   while i<pos-1 and p:

       p=p.next

       i+=1

   t=p.next.data

   p.next=p.next.next

   return t


8. 删除单链表重复元素

#删除单链表重复元素

def delsame(head):

   p=head

   while p:

       q=p.next

       r=p

       while q:

           if q.data==p.data:

               r.next=q.next

               q=q.next

           else:

               r=r.next

               q=q.next

       p=p.next

   return 1

总结

本章主要介绍了单链表的基本操作,具体有创建单链表、遍历单链表、单链表的插入以及删除等算法。

目录
相关文章
|
6月前
|
算法
【每日一题】牛客网——链表的回文结构
【每日一题】牛客网——链表的回文结构
【每日一题】LeetCode——链表的中间结点
【每日一题】LeetCode——链表的中间结点
【剑指offer】-反转链表-15/67
【剑指offer】-反转链表-15/67
|
6月前
牛客网-反转链表
牛客网-反转链表
26 0
|
存储 算法
顺序表、链表刷题指南(力扣OJ)
顺序表、链表刷题指南(力扣OJ)
60 0
【LeetCode】单链表——刷题
【LeetCode】单链表——刷题
剑指offer 23. 反转链表
剑指offer 23. 反转链表
55 0
Leetcode剑指offer 24 反转链表
Leetcode剑指offer 24 反转链表
53 0