首页 > 其他分享 >双向链表

双向链表

时间:2023-01-30 21:22:21浏览次数:37  
标签:结点 DuLinkList int next 链表 prior 双向

双向链表

单链表查找某结点的后继结点的执行时间为O(1);单链表查找某结点的后继结点的执行时间为O(n)

在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链

双向链表具有对称性:p->next->prior=p=p->prior->next

双向链表插入、删除时,须同时修改两个方向的指针时间复杂度均为O(n)

image

image


双向链表的定义

typedef struct Dulnode{
    int data;
    struct Dulnode *prior,*next;
}DulNode,*DuLinkList;

双向循环链表

  • 让头结点的前驱指针指向链表的最后一个结点
  • 让最后一个结点的后继指针指向头结点

image


双向链表的插入

image

  1. s->prior=p->prior;
  2. p->prior->next=s;
  3. s->next=p;
  4. p->prior=s;
DuLinkList GetElemP_Dul(DuLinkList L,int i){
    DuLinkList p;
    p=L->next;
    int j=1;
    while (p&&j<i){
        p=p->next;
        j++;
    }
    if(!p||j>i) return 0;
    return p;
}

int ListInsert_Dul(DuLinkList L,int i,int e){
    DuLinkList p,s;
    s=(DuLinkList)malloc(sizeof(DulNode));
    if(!(p=GetElemP_Dul(L,i))) return 0;
    s->prior=p->prior;
    p->prior->next=s;
    s->next=p;
    p->prior=s;
  	return 1;
}

双向链表的删除

删除带头结点的双向循环链表L的第i个元素,用e返回;

p->prior->next=p->next;p->next->prior=p->prior;

int  ListDelete_Dul(DuLinkList L,int i,int *e){
    DuLinkList p;
    if(!(p=GetElemP_Dul(L,i))) return 0;
    *e=p->data;
    p->prior->next=p->next;
    p->next->prior=p->prior;
    free(p);
    return 1;
}

时间复杂度O(1)

标签:结点,DuLinkList,int,next,链表,prior,双向
From: https://www.cnblogs.com/yuanyu610/p/17077278.html

相关文章

  • LeetCode 删除链表的倒数第 N 个结点(/)
    原题解题目给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。约束题解方法一classSolution{public:intgetLength(ListNode*head){......
  • Redis的设计与实现(2)-链表
    链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表:当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用......
  • 单链表的倒数第 k 个节点
    /***单链表的倒数第k个节点*/constlinkList={value:1,next:{value:2,next:{value:3,next:{......
  • 单向链表利用快慢指针
    /***单链表的中点*/constmiddleNode=(node=linkList)=>{letslow=node,fast=node;while(fast&&fast.next){slow=slow.next......
  • 循环链表
    循环链表一种头尾相接的链表,表中最后一个结点的指针域指向头结点,整个链表形成一个环即没有NULL指针,因此遍历操作时,终止条件是否等于头指针优:从表中任一结点出发,均可找到......
  • 1669. 合并两个链表
    1669.合并两个链表題解:模拟链表操作/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode......
  • 单链表
    线性表的链式存储线性表的链式表示又称为非顺序映像或链式映像结点在存储器中位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻;链表中的逻辑次序和物理次序不一定......
  • 114. 二叉树展开为链表
    问题描述https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/解题思路这个题目,用一个数组就能很好的解决。但空间复杂度是O(n).题目中给的......
  • LeetCode:1669. 合并两个链表
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListN......
  • LeetCode-21.合并两个有序链表
    21.合并两个有序链表(MergeTwoSortedLists)将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4......