深入浅出数据结构实现-链表(Linked_list)

视频出现的都手动实现了,只多不少,仅供参考 

视频地址

【强烈推荐】深入浅出数据结构 - 顶尖程序员图文讲解 - UP主翻译校对 (已完结) 


单向链表 

//
// Created by 86151 on 2024/7/22.
//

#ifndef DATA_STRUCTURE_DS_CPP
#define DATA_STRUCTURE_DS_CPP
#include "iostream"
#include "memory"
using namespace std;


struct Node{//自己实现链表类
    int data;//节点存放的数据
    shared_ptr<Node> next;//节点存放的下个节点的地址
};
shared_ptr<Node> pop_front(shared_ptr<Node>& head,int x)//插入链表头部
{

    shared_ptr<Node> temp= make_shared<Node>();//智能指针捆绑新建节点
    temp->data=x;
    temp->next=head;//让自己的next指针指向下一个元素
    head=temp;//让上一个指针指向自己
    return head;//重置头指针

}
shared_ptr<Node> pop_back(shared_ptr<Node>& head,int x)//尾插
{
    shared_ptr<Node> temp_2 = make_shared<Node>();
    temp_2->data=x;
    if(head== nullptr)
    {
        temp_2->next=head;//让自己的next指针指向null
        head=temp_2;//让头指针指向自己
        return head;//重置头指针
    }
    shared_ptr<Node> temp_1=head;
    while(temp_1->next!= nullptr)
    {
        temp_1=temp_1->next;//找到最后一个节点
    }
    temp_2->next=temp_1->next;
    temp_1->next=temp_2;
    return head;
}
void reverseNode_2(shared_ptr<Node> current,shared_ptr<Node>& head)//递归逆序
{
    if (current->next == nullptr)//递归结束条件,到达尾部,让head指向尾部节点
    {
        head=current;
        return ;
    }
    reverseNode_2(current->next,head);
    auto cur_next=current->next;//下一个节点的next指向本节点
    cur_next->next=current;
    current->next= nullptr;
}

void reverseNode(shared_ptr<Node>& head)//循环实现反转
{
    shared_ptr<Node> current,prev,next;//分别对应前,当前,和下个节点
    current=head;//标记当前节点指针初始化
    prev = nullptr;//前节点指针初始化
    while (current!= nullptr)//条件 此时到链表尾部,循环结束,current指向null
    {
        next=current->next;//next指针赋值
        current->next=prev;//让当前节点指向前一个节点(反转核心思想)
        prev=current;//前节点后移
        current=next;//当前节点后移,为下一次循环做准备

    }
    head=prev;//反转结束,此时prev指向正序时最后一个节点,让head指向prev,即反转后的头部

}
shared_ptr<Node> insert(shared_ptr<Node>& head,int insert_data,int insert_pos){
    //4 2 3 1-》4 5 2 3 1 5插入到第二个的位置,实际上是[2-1],所以插入到n-1位置
    //考虑特殊情况,首先是两端,插入尾部时不影响,插入头部时
    shared_ptr<Node> temp_2= make_shared<Node>();//创建指针捆绑新建节点
    temp_2->data=insert_data;//插入节点赋值
    if(insert_pos==1)
    {
        temp_2->next=head;//头指针指向下个元素的指针赋值给该节点(如果是null同样也为null)
        head=temp_2;//头指针重置
        return head;
    }
    //否则,如果要插入中间,必须找到上一个节点,由于链表的特殊性,只能遍历寻找[n-1-1]节点的位置
    shared_ptr<Node> temp_1= head;
    for(int i=0;i<insert_pos-2;i++)
    {
        temp_1=temp_1->next;//找到pos-1处节点
    }
    temp_2->next=temp_1->next;
    temp_1->next=temp_2;
    return head;
}
shared_ptr<Node> Delete_pos(shared_ptr<Node>& head,int insert_pos)//位置删除
{
    //找位置->删除
    shared_ptr<Node> temp_1=head;
    if(insert_pos==1)
    {
        head=head->next;
        return head;
    }
    for(int i=0;i<insert_pos-2;i++)
    {
        temp_1=temp_1->next;//要删除的上一个节点
    }
    shared_ptr<Node> temp_2=temp_1->next;//要删除的节点
    temp_1->next=temp_2->next;

    return head;
}
void print_plus(shared_ptr<Node>(head))//递归输出链表
{
    if(head== nullptr)
    {
        cout<<endl;
        return;
    }
    cout<<head->data<<"  ";
    print_plus(head->next);
}
void print(shared_ptr<Node> head)//遍历输出链表
{
    while (head!= nullptr)
    {
        cout<<head->data<<"  ";
        head=head->next;
    }
    cout<<endl;
}
int main()
{

    shared_ptr<Node> head= nullptr;//头指针先置空
    int n;//要插入元素个数,插入元素个数
    cout<<"请输入要插入元素个数"<<endl;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cout<<"请输入第"<<i+1<<"个插入链表的元素"<<endl;
        int x;
        cin>>x;
        head=pop_back(head,x);

    }
    cout<<"插入完成,结果是"<<endl;
    print(head);

    reverseNode_2(head,head);
    print(head);
    return 0;
}
#endif //DATA_STRUCTURE_DS_CPP

双向链表

//
// Created by 86151 on 2024/7/27.
//
#include "iostream"
#include "memory"
using namespace std;
struct Node{
    explicit Node(int i) {
        data=i;
    }

    int data;
    shared_ptr<Node> prev;
    shared_ptr<Node> next;
};
void pop_back(shared_ptr<Node>& head,int x)
{
    shared_ptr<Node> newNode= make_shared<Node>(x);

    newNode->prev= nullptr;
    newNode->next= nullptr;
    if(head== nullptr)//如果链表内没有节点
    {
        head= newNode;
        return;
    }
    shared_ptr<Node> last=head;
    while(last->next!= nullptr)
    {
        last=last->next;//找到最后一个节点
    }
    newNode->next=last->next;
    last->next=newNode;
    newNode->prev=last;
}
void Print(shared_ptr<Node> head)
{
    while (head!= nullptr)
    {
        cout<<head->data<<" ";
        head=head->next;
    }
    cout<<endl;
}
void ReversePrint_recursive(const shared_ptr<Node>& head)//递归反向
{
    //假设head默认指向正向
    if(head==nullptr)
    {
        
        return;
    }
    ReversePrint_recursive(head->next);
    cout<<head->data<<" ";
}
void ReversePrint(const shared_ptr<Node>& head)//循环反向
{
    //假设head默认指向正向
    shared_ptr<Node> temp=head;
    while (temp->next!= nullptr)
    {
        temp=temp->next;//找到最后一节点
    }
    while (temp!= nullptr)
    {
        cout<<temp->data<<" ";
        temp=temp->prev;
    }
    cout<<endl;
}
int main()
{
    shared_ptr<Node> head= nullptr;//头指针初始化
    int n;//要插入元素个数,插入元素个数
    cout<<"请输入要插入元素个数"<<endl;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cout<<"请输入第"<<i+1<<"个插入链表的元素"<<endl;
        int x;
        cin>>x;
        pop_back(head,x);

    }
    cout<<"插入完成,结果是"<<endl;
    Print(head);
    ReversePrint(head);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值