单向链表的结构
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
设置节点类如下:
class Node{
int item;
Node* next;
};
其中节点指针next指向节点类型变量,从而实现链表的连接
设置链表类如下,包含一节点指针head
class SingleLink{
public:
SingleLink();
~SingleLink();
Node* head;
void append(int);
};
新建一个链表,初始化如下:
SingleLink::SingleLink(){
head = new Node();
head->item = 0;
head->next = NULL;
}
在head = new Node()时,指针head便有了个新的对象
详解链表尾插法实现原理
1.插入第一个元素,指针n有个新对象
Node* n = new Node();
n->item = 11;
n->next = NULL;
指针next等于指针n,表示next的指向与n的指向一致
head->next = n;
n->next = NULL;
2.插入第二个元素,即n又有了个新对象
Node* n = new Node();
n->item =22;
n->next = NULL;
令临时指针temp指向head的指向,循环后,temp的指向指向链表0号位中next的指向,过程图如下:
temp = head;
while(temp->next!=NULL){
temp =temp->next;
temp->next = n;
完成第二个节点的尾插
以此类推,插第n个时,temp指针要指n下,所以链表中append指令时间复杂度为O(n)
具体代码
实现单向链表基本操作代码如下,包含删除,插入,遍历等功能
// 单链表测试.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class Node{
public:
Node();
~Node();
public:
int item;
Node* next;
};
Node::Node()
{
}
Node::~Node()
{
}
class SingleLink{
public:
SingleLink();
~SingleLink();
Node* head;
bool is_Linkempty();
void append(int);
void travel();
int get_length();
void add(int);
void insert(int pos,int item);
int search(int item);
void delete_last();
void delete_first();
void deleta_pos(int pos);
void remove(int item);
};
SingleLink::SingleLink(){
head = new Node();
head->item = 0;
head->next = NULL;
}
SingleLink::~SingleLink(){
}
bool SingleLink::is_Linkempty(){
return head->next == NULL;
}
void SingleLink::append(int item){
Node* n = new Node();
Node* temp;
n->item = item;
n->next = NULL;
if (head->next == NULL)
{
head->next = n;
n->next = NULL;
return;
}
//容易错啊
//temp = head->next;
//while(temp!=NULL){
// temp = temp->next;
//}
//temp->next= n;
temp = head;
while(temp->next!=NULL){
temp =temp->next;
}
//只有这样才能改变这个节点的指针域的值啊
temp->next = n;
}
int SingleLink::get_length(){
int size = 0;
//数数用的游标
Node*cur = head;
while(cur->next!=NULL){
size++;
cur=cur->next;
}
return size;
}
void SingleLink::travel(){
//游标
Node*cur = head->next;
while(cur!=NULL){
cout<<cur->item<<"->";
cur = cur->next;
}
cout<<"Null"<<endl;
}
void SingleLink::add(int item){
Node* n = new Node;
n->item = item;
n->next = head->next;
head->next = n;
}
void SingleLink::insert(int pos,int item){
//pos是0到length-1
if (pos<=0)
{
add(item);
return;
}
if (pos>=(this->get_length()))
{
append(item);
return;
}
Node* cur1 = head;
Node* cur2 = head;
for (int j =0;j<=pos-1;j++)
{
cur1 = cur1->next;
cur2 = cur2->next;
}
cur2 = cur2->next;
Node* n = new Node();
n->item = item;
n->next = cur2;
cur1->next = n;
}
int SingleLink::search(int item){
//搜索链表中第一个出现该数字的下标
int pos = 0;
Node* cur = head;
while(cur->next!=NULL){
cur = cur->next;
if(cur->item ==item)
{
return pos;
}
pos++;
}
cout<<"没有该数据"<<endl;
return -1;
}
void SingleLink::delete_last(){
if (get_length()<=0)
{
return;
}
if (get_length()==1)
{
head->next = NULL;
return;
}
/*if(get_length()-2>=0)*/
Node* cur1 = head;
for(int i = 0;i<=get_length()-2;i++){
cur1 = cur1->next;
}
//Node* cur2 = cur1->next;
//free(cur2);
cur1->next = NULL;
}
void SingleLink::delete_first(){
if (get_length()<=0)
{
return;
}
if (get_length()==1)
{
head->next = NULL;
return;
}
Node* cur1 = head->next;
head->next = cur1->next;
}
void SingleLink::deleta_pos(int pos){
if (pos>=get_length()-1)
{
delete_last();
return;
}
if (pos<=0)
{
delete_first();
return;
}
Node* cur = head;
for(int j=0;j<pos;j++)
{
cur = cur->next;
}
//循环后是3个节点中最前的节点
Node*cur1 = cur->next;
cur->next = cur1->next;
}
void SingleLink::remove(int item){
//删除第一次出现的元素
if (search(item)==-1)
{
return;
}
deleta_pos(search(item));
}
int main()
{
cout<<"hello world"<<endl;
SingleLink* L = new SingleLink();
L->add(2);
L->append(1);
L->append(2);
L->append(5);
L->travel();
cout<< L->get_length()<<endl;
L->add(70);
L->travel();
L->insert(1,100);
L->travel();
cout<< L->search(70)<<endl;
cout<< L->get_length()<<endl;
L->remove(12);
L->remove(2);
L->travel();
system("pause");
return 0;
}
小结
单链表是数据结构与算法的基础,特记录自己的学习思路
来源:CSDN
作者:曾令城
链接:https://blog.csdn.net/weixin_42355349/article/details/104720270