單向鏈表的結構
單向鏈表也叫單鏈表,是鏈表中最簡單的一種形式,它的每個節點包含兩個域,一個信息域(元素域)和一個鏈接域。這個鏈接指向鏈表中的下一個節點,而最後一個節點的鏈接域則指向一個空值。
設置節點類如下:
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;
}
小結
單鏈表是數據結構與算法的基礎,特記錄自己的學習思路