数据结构:链表

简介: 数据结构:链表

1.单链表的逻辑结构与存储结构


1.1逻辑结构


逻辑结构:数据元素之间的逻辑关系


集合、线性结构(一对一)、树形结构(一对多)、图结构(多对多)


1.2存储结构


存储结构:顺序存储、链式存储、索引存储、散列存储


顺序存储(顺序表):逻辑上相邻的元素物理位置也相邻


链式存储(单链表):逻辑上相邻的元素物理位置不一定相邻


2.单链表的定义


定义单链表:


class ListNode:
    def __init__(self,val=0,next=None):
        self.val=val
        self.next=next

带头结点的单链表(写代码方便):

0748abb7af77cc20a11522d5d871d985_649c603d2c3f9e22c7139f91c183fa2b.png


不带头结点的单链表(写代码麻烦):

62389ba01e756d357a79e50934d0120b_afdffa9740eaa825743770b29b2c5a89.png


3.插入元素


3.1带头节点的单链表


#在第i个位置插入元素
def Insert(head,i,elem):
    assert i >=0
    cur = head
    while i!=0:
        i-=1
        cur=cur.next
        if not cur:
            return False
    temp=cur.next
    cur.next=elem
    elem.next=temp
    return True


3.2不带头节点的单链表


#在第i个位置插入元素
def Insert(i,elem)
    global head
    assert i>=0
    if i==0:
        elem.next=head
        head=elem
    cue=head
    while i>1:
    i-=1
    cur=cur.next
    if not cur:
        return Flase
    temp=cur.next
    cur.next=elem
    elem.next=temp
    return True


4.删除元素


def ListDelete( head, i) :
    assert i >= 0
    cur = head
    while i != 0:
        i -= 1
        cur = cur.next
        if not cur.next:
            return False
    cur.next = cur.next.next
    return True


5.创建单链表


5.1尾插法创建单链表


带头节点的单链表:


def BuildLink_Tai1(1):
    head = ListNode( )
    temp = head
    for elem in l:
        temp.next = ListNode(elem)
        temp = temp.next
    return head
head = BuildLink_Tail([1,2,3,4])
while head.next:
    head = head.next
    print( head.val)

不带头节点的单链表:


def BuildLink_Tail(1):
    if not l:
        return None
    head = ListNode(l[0])
    temp = head
    for elem in 1[1:]:
        temp.next = ListNode(elem)
        temp = temp.next
    return head
head = BuildLink_Tail([1,2,3,4])
while head:
    print( head.val)
    head = head.next


5.2头插法创建单链表


带头节点的单链表:


def BuildLink_Head( 1) :
    head = ListNode()
    for elem in l:
        temp = head.next
        head.next = ListNode(elem,temp)
    return head

不带头节点的单链表:


def BuildLink_Head(1):
    head = None
    for elem in l:
        head = ListNode(elem,head)
    return head


6.双链表


解决单链表无法逆向索引的问题

cc394a92546d0727e0fa0aa86ffd2d7b_b529d91fd83020ea81741567c0c0c584.png


class DLinkNode:
    def __init__(self, val=0,next=None,prior):
    self.val = val
    self.next = next
    self.prior = prior


7.循环链表


7.1循环单链表


从一个节点出发可以找到其他任何节点

1fbc0090dc91f947aaaffd99220285ed_0ebfa60b8f94a82badd8037ae8391704.png


7.2循环双链表


从头找到尾和从尾找到头时间复杂度都是O(1)

5bc253072a4be86fe998345048de1d4f_8ced43b7eb4bd35fc69dca61f94b2952.png


目录
相关文章
|
9天前
|
存储 Java
Java数据结构:链表
Java数据结构:链表
22 2
TU^
|
13天前
|
存储 索引
数据结构~~链表
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的
TU^
24 0
|
8天前
|
缓存 算法
【数据结构】----链表--双向链表
【数据结构】----链表--双向链表
14 0
|
8天前
|
存储 缓存 算法
【数据结构】线性表----链表详解
【数据结构】线性表----链表详解
19 0
|
9天前
|
存储
数据结构——链表
数据结构——链表
17 0
|
9天前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
18 1
|
10天前
|
Java
DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点
力扣203题解:使用时间复杂度为O(n)的思路删除链表中所有值为key的元素。引入辅助指针pre,记录cur的前一个节点,遍历链表时,若cur.val!=key,pre和cur同时前进;若cur.val==key,则pre.next=cur.next,cur继续前进,确保pre不急于跟随以处理连续相同值的情况。遍历结束后,处理头节点可能需要删除的特殊情况。
22 0
|
13天前
|
存储 缓存
数据结构(链表)
数据结构(链表)
22 0
|
14天前
|
算法 测试技术
【数据结构与算法 | 基础篇】单向循环链表实现队列
【数据结构与算法 | 基础篇】单向循环链表实现队列
|
14天前
|
算法 索引
【数据结构与算法 | 基础篇】[链表专题]力扣141, 142
【数据结构与算法 | 基础篇】[链表专题]力扣141, 142