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;
}