連結串列——自己動手寫了一下C++的
阿新 • • 發佈:2021-01-13
技術標籤:Datawhale--LeetCode50題預備知識連結串列指標資料結構c++
連結串列
連結串列是一種資料結構,是一種功能極其強大的陣列。連結串列可以很輕鬆的進行增添,刪除,插入節點。
目錄
單向連結串列
初學者一般先從單向連結串列開始,單向連結串列的操作一般包括:建立,修改,插入,輸出,排序,反序,清空,求長度。
1.建立連結串列
利用結構體來定義節點,通過指標來實現連結串列
1.1建立節點
利用結構體進行建立連結串列的節點
struct NodeList
{
int val;
NodeList *next;
};
下面再進行連結串列的節點定義時,可以直接用NodeList *node來進行定義
1.2初始化
建立n個節點的單向連結串列
NodeList *CreateList(int &n) { NodeList *head,*node,*end; //建立頭節點,中間節點,尾節點 head=new NodeList; //給頭結點分配地址 end=head; //令尾節點等於頭結點 for(int i=0;i<n;i++) { node =new NodeList; //給每一個Node分配地址 cin>>node.val; //輸入每一個節點的值 end.next=node; //讓尾節點(第一次是頭節點)的指標指向下一個節點 end=node; //讓尾節點等於新新增的節點 } end.next=NULL; //給最後一個節點的下一個節點置空 return head; //返回頭部指標 }
2.連結串列長度
返回連結串列的長度,即length或者size
int length(ListNode *head) //返回連結串列的長度
{
ListNode *p = new ListNode;
p = head;
int len = 0;
while (p->next != nullptr)
{
p = p->next;
len++;
}
return len;
}
3.連結串列列印
通過迴圈來列印連結串列的節點
void PrintList(ListNode *head) //列印連結串列 { ListNode *p = head; while (p->next != nullptr) { p = p->next; cout << p->val << " "; } }
4.查詢節點
通過遍歷查詢是否存在(返回節點的第一次出現的位置)
int FindNode(ListNode *head, const int &n) //查詢連結串列中是否存在n,存在返回第一次位置,不存在返回-1
{
ListNode *p = new ListNode;
p = head;
int Pos = 0;
while (p->next != nullptr)
{
p = p->next;
Pos++;
if (p->val == n)
return Pos;
}
return -1;
}
5.刪除節點
找到連結串列的第n個節點,通過修改指標,讓n個節點的上一個節點指向n的下一個節點,釋放第n個節點
bool DeleteNode(ListNode *head, const int n) //刪除連結串列的第n個節點
{
if (length(head) < n)
return false;
ListNode *temp = new ListNode;
for (int i = 0; i < n - 1; i++)
{
head = head->next;
}
temp = head->next;
head->next = head->next->next;
delete (temp);
return true;
}
6.增加節點
通過修改指標的指向來在中間新增節點
bool AddNode(ListNode *head, const int Pos, const int value) //新增一個節點,在pos這個位置新增一個數值為value的節點
{
if (length(head) < Pos)
return false;
for (int i = 0; i < Pos - 1; i++)
{
head = head->next;
}
ListNode *temp = new ListNode;
temp->val = value;
temp->next = head->next;
head->next = temp;
return true;
}
7.修改節點
先查詢到節點,在修改節點的值
bool ChangeNode(ListNode *head, const int Pos, const int Value) //修改節點 修改位置pos上的值為value
{
if (length(head) < Pos)
return false;
for (int i = 0; i < Pos; i++)
{
head = head->next;
}
head->val = Value;
return true;
}
完整程式碼
/**
* @分函式編寫單鏈表
*
*
* @1.連結串列建立 √
* @2.連結串列長度 √
* @3.連結串列列印 √
* @4.查詢節點 √ 返回位置
* @5.刪除節點 √
* @6.增加節點 √
* @7.修改節點 √
*
*
* @Progra:Zbooo
**/
#include <iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
};
ListNode *CreatNode(int &n) //建立n個節點的連結串列
{
ListNode *head, *node, *end;
head = new ListNode;
end = head;
for (int i = 0; i < n; i++)
{
node = new ListNode;
cin >> node->val;
end->next = node;
end = node;
}
end->next = nullptr;
return head;
}
void PrintList(ListNode *head) //列印連結串列
{
ListNode *p = head;
while (p->next != nullptr)
{
p = p->next;
cout << p->val << " ";
}
}
int length(ListNode *head) //返回連結串列的長度
{
ListNode *p = new ListNode;
p = head;
int len = 0;
while (p->next != nullptr)
{
p = p->next;
len++;
}
return len;
}
int FindNode(ListNode *head, const int &n) //查詢連結串列中是否存在n,存在返回位置,不存在返回-1
{
ListNode *p = new ListNode;
p = head;
int Pos = 0;
while (p->next != nullptr)
{
p = p->next;
Pos++;
if (p->val == n)
return Pos;
}
return -1;
}
bool DeleteNode(ListNode *head, const int &n) //刪除連結串列的第n個節點
{
if (length(head) < n)
return false;
ListNode *temp = new ListNode;
for (int i = 0; i < n - 1; i++)
{
head = head->next;
}
temp = head->next;
head->next = head->next->next;
delete (temp);
return true;
}
bool AddNode(ListNode *head, const int Pos, const int &value) //新增一個節點,在pos這個位置新增一個數值為value的節點
{
if (length(head) < Pos)
return false;
for (int i = 0; i < Pos - 1; i++)
{
head = head->next;
}
ListNode *temp = new ListNode;
temp->val = value;
temp->next = head->next;
head->next = temp;
return true;
}
bool ChangeNode(ListNode *head, const int Pos, const int &Value) //修改節點 修改位置pos上的值為value
{
if (length(head) < Pos)
return false;
for (int i = 0; i < Pos; i++)
{
head = head->next;
}
head->val = Value;
return true;
}
int main()
{
int n;
cin >> n;
ListNode *head = new ListNode;
head = CreatNode(n);
DeleteNode(head, 3);
AddNode(head, 3, 10);
ChangeNode(head, 3, 10);
cout << FindNode(head, 3) << endl;
PrintList(head);
system("pause");
return 0;
}