C++实现单链表实现以及链表反转

该博客介绍了用C++实现单链表及链表反转。链表反转思路是将原链表首个元素脱离作为新链表首元素,其余元素依次头插入。实现过程需3个Node临时变量,还给出了相关代码文件linklist.h和linklist.cpp。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++实现单链表以及链表反转

链表反转思路:将链表的第一个元素从链表中脱离,作为反转后的最后一个元素,也是新链表刚开始的一个元素,之后依次将其余元素依次头插入第一个元素。主要需要3个Node临时变量。一个为空,作为第一个元素的下一个元素;一个临时存储原来链表被截取之后的首个地址;一个作为循环条件,依次将从原链表中取下元素赋值给该元素,进行循环判断。
//linklist.h

#ifndef LINKLIST_H
#define LINKLIST_H

typedef  int  DataType;
struct Node
{
    DataType data;
    Node *next;
};
class LinkList
{
public:
    LinkList();
    ~LinkList();
    int CreateLinkList(int size);
    int BYELinkList();
    int TravalLinkList();
    void InsertLinklList(int n);
    void RerverseList();
    int GetLen();
    bool IsEmply();

    Node *_head;
    Node *_rear;
    int _size;
};

#endif // LINKLIST_H

//linklist.cpp

#include<iostream>
#include "linklist.h"

using namespace std;

LinkList::LinkList()
{
    _head = _rear = NULL;
    _size = 0;
}

LinkList::~LinkList()
{
    Node *tmp=NULL;
    while(_head!=NULL)
    {
        tmp = _head;
        _head = _head->next;
        delete  tmp;
    }
    cout<<"~LinkList()"<<endl;
}

int LinkList::TravalLinkList()
{
    if(_head ==NULL)
    {
        cout<<"empty linklist"<<endl;
    }
    Node *tmp = _head;
    while(tmp!=NULL)
    {

        cout<<tmp->data<<" ";
        tmp = tmp->next;
    }

    cout <<"NULL"<< endl;
    return 0;
}
//尾插法插入链表元素
void LinkList::InsertLinklList(int n)
{
    Node *p = new Node;
    p->data = n;
    p->next = NULL;

    if(_head==NULL)
    {
        _head = p;
    }else
    {
        _rear->next = p;
    }

    _rear = p;
    _size++;
}
//头插法实现反转
void LinkList::RerverseList()
{
    if(_head==NULL||_head->next==NULL)
    {
        cout<<"empty list or only 1"<<endl;  //只有一个或没有不反转
        return;
    }
    _rear = _head;
    Node *newfirst = NULL;
    Node *second =_head;   //原链表的第一个元素
    Node *tmp = NULL;   //做为临时变量,指向原链表未断开的成员(可以理解为原来链表的新的头部)。
    while(second!=NULL)
    {
        tmp = second->next;
        second->next = newfirst;  //断开与原链表的连接,重新用头插法连接到新的链表当中
        newfirst = second;      //新链表的头部更新
        second = tmp;
    }
    _head = newfirst;
}
int LinkList::GetLen()
{
    return this->_size;
}

main.cpp
#include <iostream>
#include"linklist.h"
using namespace std;

int main()
{
    LinkList *l = new LinkList;
    l->InsertLinklList(5);
    l->InsertLinklList(7);
    l->InsertLinklList(10);
    l->InsertLinklList(66);
    l->InsertLinklList(69);
    cout<<"size is "<<l->_size<<endl;
    cout<<"head is "<<l->_head->data<<endl;
    cout<<"rear is "<<l->_rear->data<<endl;
    l->TravalLinkList();

    l->RerverseList();
    cout<<"after reverse "<<endl;
    l->TravalLinkList();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值