首页 > 其他分享 >链表3: 双链表

链表3: 双链表

时间:2024-04-16 23:24:06浏览次数:25  
标签:Node cout roar nextNode 链表 header 双链

链表3: 双链表


双链表的结构

双链表与单链表最大的不同就是不仅存储了结点的后继, 还存储了结点的前驱.


创建双链表的数据结构

typedef struct Node{
    struct Node *preNode; //前驱
    int data; //数据域
    struct Node *nextNode; //后继
} Node;

双链表初始化

//返回头结点
Node* initHeader(Node *header){
    if(header){
        cout << "链表已存在, 无需创建" << endl;
        return header;
    }
    header = (Node*)malloc(sizeof(Node));
    header->preNode = NULL;
    header->data = -1;
    header->nextNode = NULL;
    return header;
}

后插法添加元素

void addNode(Node *header, Node *roar, int &length){ //(后插法添加元素)
    if(!header){
        cout << "链表为空" << endl;
        return;
    }
    roar = header; //寻找尾结点
    while(roar->nextNode != NULL){
        roar = roar->nextNode;
    }

    int val;
    cout << "请输入值: ";
    cin >> val;

    Node *newNode = (Node*)malloc(sizeof(Node));
    //为新结点赋值 
    newNode->data = val;
    //新结点的前驱更新为roar    
    newNode->preNode = roar;
    //新结点的后继指向NULL
    newNode->nextNode = NULL; 
    //roar后继指向新结点    
    roar->nextNode = newNode; 

    //链表长度++
    length++;
}

双链表的输出

void display(Node *header){
    if(!header){
        cout << "链表为空" << endl;
        return;
    }
    Node *curNode = header->nextNode;
    while(curNode!=NULL){
        cout << curNode->data << " ";
        curNode = curNode->nextNode;
    }   
    cout << endl;
}

测试

int main(){
    Node *header = NULL;
    Node *roar = (Node*)malloc(sizeof(Node));
    int length = 0; //链表长度
    int choice; //选项
    do{
        cout << "------------------------------" << endl;
        cout << "1.创建" << endl;
        cout << "2.在尾部插入新节点" << endl;
        cout << "3.输出链表" << endl;
        cout << "0.退出" << endl;
        cout << "输入选项:";
        cin >> choice;
        switch(choice){
            case 1:
                header = initHeader(header);
                break;
            case 2:
                addNode(header, roar, length);
                break;
            case 3:
                display(header);
                break;
            default:
                break;
        }
    }while(choice!=0);
    
    system("pause");
    return 0;
}

标签:Node,cout,roar,nextNode,链表,header,双链
From: https://www.cnblogs.com/HIK4RU44/p/18139528

相关文章

  • 1025 反转链表
    我看其他博客用的reverse,但是下标我真的有点糊涂,以下是参考某位dalao的。#include<bits/stdc++.h>usingnamespacestd;structnode{ intsno; intdata; intnext;}s[100010];intmain(){ intstart,cnt,fz;//start cin>>start>>cnt>>fz; for(inti=0;i<cnt......
  • 说说你对链表的理解?常见的操作有哪些?
    一、是什么链表(LinkedList)是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,由一系列结点(链表中每一个元素称为结点)组成每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域 节点用代码表......
  • 合并k个已排序链表
    利用新的ArrayList合并k个链表 遍历提供给我们的数组,依次得到各个头结点。依次遍历每个头结点下的链表,把他们加入新的数组中。利用Collections.sort()方法得到有序的数组最后把这个新的数组转换成链表并返回。publicListNodemergeKLists(ArrayList<ListNode>lists){......
  • 随机链表的复制
     随机链表的复制 /*//DefinitionforaNode.classNode{intval;Nodenext;Noderandom;publicNode(intval){this.val=val;this.next=null;this.random=null;}}*/classSolution{publicNode......
  • 链表中环的入口结点
       1.先用快慢指针判断是否存在环2.返回快慢指针相遇的地方,一个指针停留在那里。3.另一个指针回到头节点4.两个节点一起走,每次走一格,再次相遇的地方就是入口节点publicclassSolution{    //判断有没有环,返回相遇的地方    publicListNodehasCycle(ListN......
  • 链表2: 动态单链表
    链表2:动态单链表定义数据结构//定义链表数据结构typedefstructLNode{intdata;structLNode*next;}LNode;初始化链表//初始化链表LNode*Init_LinkList(){//返回头指针//创建头结点LNode*header=(LNode*)malloc(sizeof(LNode));hea......
  • 链表1: 静态单链表
    链表1:静态单链表单链表的结构链表包含了数据域与指针域,数据域存储数据,指针域存储下一个结点的地址链表的特点链表的优势在于数据的删改,在链表中查询第$i$个元素需要从第一个结点开始遍历链表,,因此在数据的顺序读取中链表的优势不如数组.链表的插入操作设newN......
  • JZ76 删除链表中重复的节点
    1、相似题classSolution{public:ListNode*deleteDuplicates(ListNode*head){//判空if(head==NULL)returnnullptr;ListNode*p1=head;ListNode*p2=p1->next;while(p2){......
  • 数据结构-链表
    数据结构-链表1.链表的基本概念:链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向列表中下一个节点的引用(或指针)。2.单向链表:单向链表的每个节点只有一个指向下一个节点的链接。这种结构使得遍历只能单向进行,从头节点开始到尾节点结束。classNode:d......
  • JZ22 链表中倒数最后k个节点
    /***structListNode{* intval;* structListNode*next;* ListNode(intx):val(x),next(nullptr){}*};*/classSolution{public:/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@param......