五種編程語言解釋資料結構與演算法—單鏈表
目錄- 五種編程語言解釋資料結構與演算法—單鏈表
- 1、單鏈表的定義
- 2、單鏈表的實作
- 3、單鏈表的邏輯示意圖
- 3.1、第一種邏輯方式:只有頭指標,沒有頭結點
- 3.2、第二種實作邏輯方式:有頭結點
- 4、使用C語言來實作單鏈表的基本操作
- 4.0、建立鏈表和鏈表結點的結構體
- 4.1、頭插法建立單鏈表
- 4.2、尾插法建立單鏈表
- 4.3、按序號查找和按值查找
- 4.4、插入新結點的操作
- 4.5、洗掉結點的操作
- 4.6、完整代碼
- 5、使用C++語言來實作單鏈表的基本操作
- 6、使用java語言來實作單鏈表的基本操作
- 7、使用javaScript語言來實作單鏈表的基本操作
- 8、使用Python語言來實作單鏈表的基本操作
1、單鏈表的定義
線性表的鏈式存盤又稱為單鏈表,通過一組任意的存盤單元來存盤線性表中的資料元素,

2、單鏈表的實作

3、單鏈表的邏輯示意圖
3.1、第一種邏輯方式:只有頭指標,沒有頭結點

這種方式,當head為null時,單鏈表L為空,
3.2、第二種實作邏輯方式:有頭結點

這種方式,當head->next為null時,單鏈表L為空,
優點:鏈表的第一個位置和其他位置的操作統一空表和非空表的操作統一,
4、使用C語言來實作單鏈表的基本操作
4.0、建立鏈表和鏈表結點的結構體
有單鏈表的性質可知,單鏈表中包含著結點,結點又由兩部分組成,一部分為資料,一部分為下一個結點的地址,所以可以將結點定義為:
//鏈表結點
typedef struct LinkNode {
void* data; //void* 無型別指標,可以指向任何型別的資料
struct LinkNode* next;
}LinkNode;
為了方便表述鏈表,這里使用有頭結點的鏈表結構,并且需要一個int型別的變數來記錄鏈表的長度,
//鏈表結構體
typedef struct LinkList {
LinkNode* head; //頭節點
int size; //大小
//不需要容量
}LinkList;
這里撰寫一個函式,進行鏈表的初始化操作,
//初始化鏈表
LinkList* Init_LinkList() {
LinkList* list = (LinkList*)malloc(sizeof(LinkList));
list->size = 0;
//頭節點,不保存資料資訊
list->head = (LinkNode*)malloc(sizeof(LinkNode));
list->head->data = https://www.cnblogs.com/xgp123/p/NULL;
list->head->next = NULL;
return list;
}
4.1、頭插法建立單鏈表

由圖可以看出,想要實作頭插入操作時,只需要將上一個結點的地址指向要插入結點的頭部,而將要插入結點的地址指標指向原先上一個結點指向的地址即可,該頭插法插入的特點為,后面插入的元素在鏈表的頭部,
//頭插法建立單鏈表
LinkList* List_HeadInsert(int size) {
//創建鏈表
LinkList* list = Init_LinkList();
//用戶輸入size個整數
int x;
scanf("%d\n",&x);
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
for(int i = 0;i < size;i++) {
//初始化一個結點
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
scanf("%d\n",&x);
newNode->data = https://www.cnblogs.com/xgp123/p/&x;
newNode->next = list->head->next;
list->head->next = newNode;
list->size++;
}
return list;
}
該演算法的時間復雜度為O(n)
4.2、尾插法建立單鏈表

使用尾插法建立單鏈表,就是在尾部進行鏈表結點的加入,使得輔助指標后移,實作尾部插入,該插入方法的特點為,后來的元素在鏈表后面,
//尾插法
LinkList* List_TailInsert(int size) {
//創建鏈表
LinkList* list = Init_LinkList();
//用戶輸入size個整數
int x;
scanf("%d\n",&x);
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
//找結點
//輔助指標變數
LinkNode* pCurrent = list->head;
for(int i = 0; i < size;i++) {
pCurrent = pCurrent->next;
}
for(int i = 0;i < size;i++) {
//初始化一個結點
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
scanf("%d\n",&x);
newNode->data = https://www.cnblogs.com/xgp123/p/&x;
newNode->next = NULL;
//遍歷完后,輔助指標就指向的是最后一個結點
pCurrent->next = newNode;
pCurrent = pCurrent->next;
list->size++;
}
return list;
}
該演算法的時間復雜度為O(n)
4.3、按序號查找和按值查找

按序號查找,就是通過輔助指標遍歷到需要查找的序號的位置,并且將該結點進行回傳,代碼如下,
//按序號查找
LinkNode* getElem(LinkList* list,int pos) {
if(list == NULL) return NULL;
if(pos == 0) return list->head;
if(pos < 1 || pos > list->size) return NULL;
//找結點
//輔助指標變數
LinkNode* pCurrent = list->head->next;
//遍歷查找
for(int i = 0; i < pos - 1;i++) {
pCurrent = pCurrent->next;
}
return pCurrent;
}
按值查找,就是回圈遍歷整個鏈表,然后于傳入的值進行匹配,如果相等,則回傳該結點,
//查找
int Find_LinkList(LinkList* list,void* data) {
if(list == NULL) return -1;
if(data =https://www.cnblogs.com/xgp123/p/= NULL) return -1;
//定義輔助指標
LinkNode* pCurrent = list->head->next;
for(int i = 1;i <= list->size;i++) {
if(pCurrent->data == data) {
return i;
}
pCurrent = pCurrent->next;
}
return -1;
}
這兩個查找的演算法都為O(n)
4.4、插入新結點的操作

右圖可以看出,插入操作以頭插法建立單鏈表的操作幾乎一樣,只不過在這里是把頭結點替換成了任意結點,
//插入
void Insert_LinkList(LinkList* list, int pos,void* data) {
if(list == NULL) return;
if(data =https://www.cnblogs.com/xgp123/p/= NULL) return;
//將用戶的從1開始排序,轉換成為程式員理解的從0開始排序
pos = pos - 1;
if(pos < 0 || pos > list->size) return;
//創建新的結點
LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode));
newNode->data = data;
newNode->next = NULL;
//找結點
//輔助指標變數
LinkNode* pCurrent = list->head;
for(int i = 0; i < pos;i++) {
pCurrent = pCurrent->next;
}
//新節點入鏈表
newNode->next = pCurrent->next;
pCurrent->next = newNode;
list->size++;
}
4.5、洗掉結點的操作

在單鏈表中,如果要洗掉一個結點,只需要將待洗掉結點的前一個結點指向待洗掉結點的下一個結點即可,
//洗掉指定位置的值
void RemoveByPos_LinkList(LinkList* list,int pos) {
if(list == NULL) return;
if(pos < 1 || pos > list->size) return;
//找結點
//輔助指標變數
LinkNode* pCurrent = list->head;
//指向前一個結點
for(int i = 1; i < pos;i++) {
pCurrent = pCurrent->next;
}
//快取洗掉的結點
LinkNode* pDel = pCurrent->next;
pCurrent->next = pDel->next;
//釋放洗掉結點的記憶體
free(pDel);
list->size--;
}
4.6、完整代碼
-
LinkList.h檔案中的內容,該檔案內容定義了該單鏈表具有的方法
#ifndef XGP_STUDY_DEMO40_LINKLIST_H #define XGP_STUDY_DEMO40_LINKLIST_H #include <stdio.h> #include <stdlib.h> #include <string.h> //鏈表結點 typedef struct LinkNode { void* data; //void* 無型別指標,可以指向任何型別的資料 struct LinkNode* next; }LinkNode; //鏈表結構體 typedef struct LinkList { LinkNode* head; //頭節點 int size; //大小 //不需要容量 }LinkList; typedef void(*PRINTLINKNODE)(void*); //初始化鏈表 LinkList* Init_LinkList(); //插入錯作 void Insert_LinkList(LinkList* list, int pos,void* data); //頭插法建立整數型單鏈表 LinkList* List_HeadInsert(int size); //尾插法 LinkList* List_TailInsert(int size); //按序號查找 LinkNode* getElem(LinkList* list,int pos); //按值查找 int Find_LinkList(LinkList* list,void* data); //洗掉指定位置的值 void RemoveByPos_LinkList(LinkList* list,int pos); //獲得鏈表的長度 int Size_LinkList(LinkList* list); //釋放鏈表記憶體 void FreeSpace_LinkList(LinkList* list); //列印 void Print_LinkList(LinkList* list,PRINTLINKNODE print); #endif //XGP_STUDY_DEMO40_LINKLIST_H -
LinkList.c檔案的內容,該內容是對上述頭檔案中的方法做具體得實作,
#include "LinkList.h" //初始化鏈表 LinkList* Init_LinkList() { LinkList* list = (LinkList*)malloc(sizeof(LinkList)); list->size = 0; //頭節點,不保存資料資訊 list->head = (LinkNode*)malloc(sizeof(LinkNode)); list->head->data = https://www.cnblogs.com/xgp123/p/NULL; list->head->next = NULL; return list; } //插入 void Insert_LinkList(LinkList* list, int pos,void* data) { if(list == NULL) return; if(data == NULL) return; //將用戶的從1開始排序,轉換成為程式員理解的從0開始排序 pos = pos - 1; if(pos < 0 || pos > list->size) return; //創建新的結點 LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); newNode->data = data; newNode->next = NULL; //找結點 //輔助指標變數 LinkNode* pCurrent = list->head; for(int i = 0; i < pos;i++) { pCurrent = pCurrent->next; } //新節點入鏈表 newNode->next = pCurrent->next; pCurrent->next = newNode; list->size++; } //頭插法建立單鏈表 LinkList* List_HeadInsert(int size) { //創建鏈表 LinkList* list = Init_LinkList(); //用戶輸入size個整數 int x; scanf("%d\n",&x); LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); for(int i = 0;i < size;i++) { //初始化一個結點 LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); scanf("%d\n",&x); newNode->data = https://www.cnblogs.com/xgp123/p/&x; newNode->next = list->head->next; list->head->next = newNode; list->size++; } return list; } //尾插法 LinkList* List_TailInsert(int size) { //創建鏈表 LinkList* list = Init_LinkList(); //用戶輸入size個整數 int x; scanf("%d\n",&x); LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); //找結點 //輔助指標變數 LinkNode* pCurrent = list->head; for(int i = 0; i < size;i++) { pCurrent = pCurrent->next; } for(int i = 0;i < size;i++) { //初始化一個結點 LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); scanf("%d\n",&x); newNode->data = https://www.cnblogs.com/xgp123/p/&x; newNode->next = NULL; //遍歷完后,輔助指標就指向的是最后一個結點 pCurrent->next = newNode; pCurrent = pCurrent->next; list->size++; } return list; } //按序號查找 LinkNode* getElem(LinkList* list,int pos) { if(list == NULL) return NULL; if(pos == 0) return list->head; if(pos < 1 || pos > list->size) return NULL; //找結點 //輔助指標變數 LinkNode* pCurrent = list->head->next; //遍歷查找 for(int i = 0; i < pos - 1;i++) { pCurrent = pCurrent->next; } return pCurrent; } //查找 int Find_LinkList(LinkList* list,void* data) { if(list == NULL) return -1; if(data == NULL) return -1; //定義輔助指標 LinkNode* pCurrent = list->head->next; for(int i = 1;i <= list->size;i++) { if(pCurrent->data == data) { return i; } pCurrent = pCurrent->next; } return -1; } //洗掉指定位置的值 void RemoveByPos_LinkList(LinkList* list,int pos) { if(list == NULL) return; if(pos < 1 || pos > list->size) return; //找結點 //輔助指標變數 LinkNode* pCurrent = list->head; //指向前一個結點 for(int i = 1; i < pos;i++) { pCurrent = pCurrent->next; } //快取洗掉的結點 LinkNode* pDel = pCurrent->next; pCurrent->next = pDel->next; //釋放洗掉結點的記憶體 free(pDel); list->size--; } //列印 void Print_LinkList(LinkList* list,PRINTLINKNODE print) { if(list == NULL) return; //定義輔助指標變數 LinkNode* pCurrent = list->head->next; for(int i = 0;i < list->size;i++) { print(pCurrent->data); pCurrent = pCurrent->next; } } //釋放鏈表記憶體 void FreeSpace_LinkList(LinkList* list) { if(list == NULL) return; //輔助指標變數 LinkNode* pCurrent = list->head; for(int i = 0;i <= list->size;i++) { //快取下一個結點 LinkNode* pNext = pCurrent->next; free(pCurrent); pCurrent = pNext; } //釋放鏈表記憶體 list->size = 0; free(list); } //獲得鏈表的長度 int Size_LinkList(LinkList* list) { if(list == NULL)return -1; return list->size; } -
main.c檔案中的內容,該內容的代碼是用來測驗該單鏈表中的方法,
#include "LinkList.h" typedef struct Person { char name[64]; int age; int score; }Person; void MyPrint(void* data) { Person* p = (Person*)data; printf("Name:%s Age:%d Score:%d\n",p->name,p->age,p->score); } int main() { //創建鏈表 LinkNode* list = Init_LinkList(); //創建資料 Person p1 = {"aaa",23,80}; Person p2 = {"bbb",24,81}; Person p3 = {"ccc",25,82}; Person p4 = {"ddd",26,83}; Person p5 = {"eee",27,84}; //資料插入鏈表 Insert_LinkList(list,0,&p1); Insert_LinkList(list,1,&p2); Insert_LinkList(list,2,&p3); Insert_LinkList(list,3,&p4); Insert_LinkList(list,4,&p5); //列印 Print_LinkList(list,MyPrint); printf("==========================\n"); //洗掉 RemoveByPos_LinkList(list,3); Print_LinkList(list,MyPrint); //銷毀鏈表 FreeSpace_LinkList(list); return 0; } -
測驗結果
Name:bbb Age:24 Score:81 Name:ccc Age:25 Score:82 Name:ddd Age:26 Score:83 Name:eee Age:27 Score:84 ========================== Name:bbb Age:24 Score:81 Name:ccc Age:25 Score:82 Name:eee Age:27 Score:84 Process finished with exit code 0
5、使用C++語言來實作單鏈表的基本操作
- MyLinkList.h檔案的內容
#ifndef XGP_STUDY_DEMO43_MYLINKLIST_H
#define XGP_STUDY_DEMO43_MYLINKLIST_H
#include <iostream>
using namespace std;
typedef void(*PRINTLINKNODE)(void*);
template <class T>
class MyLinkNode {
public:
T* data; //存放T型別的資料
MyLinkNode* next; //下一個結點
};
template <class T>
class MyLinkList {
private:
MyLinkNode<T>* head; //頭節點
int size; //大小
public:
//初始化鏈表
MyLinkList Init_LinkList();
//插入錯作
void Insert_LinkList(int pos,T* data);
//頭插法建立整數型單鏈表
MyLinkList List_HeadInsert(int size);
//尾插法
MyLinkList List_TailInsert(int size);
//按序號查找
MyLinkNode<T> getElem(int pos);
//按值查找
int Find_LinkList(T data);
//洗掉指定位置的值
void RemoveByPos_LinkList(int pos);
//獲得鏈表的長度
int Size_LinkList();
//釋放鏈表記憶體
void FreeSpace_LinkList();
//列印
void Print_LinkList(PRINTLINKNODE print);
};
#endif //XGP_STUDY_DEMO43_MYLINKLIST_H
- MyLinkList.cpp檔案內容
#include "MyLinkList.h"
template<class T>
MyLinkList<T> MyLinkList<T>::Init_LinkList() {
MyLinkNode<T>* node = new MyLinkNode<T>();
node->data = https://www.cnblogs.com/xgp123/p/NULL;
node->next = NULL;
this->head = node;
this->size = 0;
return *this;
}
template
void MyLinkList::Insert_LinkList(int pos, T* data) {
if(this == NULL) return;
if(data == NULL) return;
MyLinkNode* newNode = new MyLinkNode();
newNode->data = data;
newNode->next = NULL;
//插入,找到一個指向pos-1的結點來的輔助指標
MyLinkNode* pCurrent = this->head;
for(int i = 1;i <= pos - 1;i++) {
pCurrent = pCurrent->next;
}
//回圈過后,此時的輔助結點就是插入結點的前一個
newNode->next = pCurrent->next;
pCurrent->next = newNode;
this->size++;
}
template
MyLinkList MyLinkList::List_HeadInsert(int size) {
//用戶輸入size個整數
int x;
scanf("%d\n",&x);
MyLinkNode<T>* newNode = new MyLinkNode<T>();
for(int i = 0;i < size;i++) {
//初始化一個結點
MyLinkNode<T>* newNode = new MyLinkNode<T>();
scanf("%d\n",&x);
newNode->data = https://www.cnblogs.com/xgp123/p/&x;
newNode->next = this->head->next;
this->head->next = newNode;
this->size++;
}
return *this;
}
template
MyLinkList MyLinkList::List_TailInsert(int size) {
//用戶輸入size個整數
int x;
scanf("%d\n",&x);
MyLinkNode<T>* newNode = new MyLinkNode<T>();
//找結點
//輔助指標變數
MyLinkNode<T>* pCurrent = this->head;
for(int i = 0; i < size;i++) {
pCurrent = pCurrent->next;
}
for(int i = 0;i < size;i++) {
//初始化一個結點
MyLinkNode<T>* newNode = new MyLinkNode<T>;
scanf("%d\n",&x);
newNode->data = https://www.cnblogs.com/xgp123/p/&x;
newNode->next = NULL;
//遍歷完后,輔助指標就指向的是最后一個結點
pCurrent->next = newNode;
pCurrent = pCurrent->next;
this->size++;
}
return *this;
}
template
MyLinkNode MyLinkList::getElem(int pos) {
if(pos < 1 || pos >= this->size) new MyLinkNode();
MyLinkNode* pCurrent = this->head;
//輔助指標
for(int i = 1;i <= pos;i++) {
pCurrent = pCurrent->next;
}
return *pCurrent;
}
template
int MyLinkList::Find_LinkList(T data) {
if(data == NULL) return -1;
//定義輔助指標變數
MyLinkNode* pCurrent = this->head->next;
for(int i = 1;i <= this->size;i++) {
if(pCurrent->data == data) {
return i;
}
pCurrent = pCurrent->next;
}
return 0;
}
template
void MyLinkList::RemoveByPos_LinkList(int pos) {
if(this == NULL) return;
if(pos < 1 || pos > this->size) return;
//找結點
//輔助指標變數
MyLinkNode* pCurrent = this->head;
//指向前一個結點
for(int i = 1; i < pos;i++) {
pCurrent = pCurrent->next;
}
//快取洗掉的結點
MyLinkNode* pDel = pCurrent->next;
pCurrent->next = pDel->next;
//釋放洗掉結點的記憶體
delete pDel;
this->size--;
}
template
int MyLinkList::Size_LinkList() {
if(this == NULL) return -1;
return this->size;
}
template
void MyLinkList::FreeSpace_LinkList() {
//輔助指標變數
MyLinkNode* pCurrent = this->head;
for(int i = 0;i <= this->size;i++) {
//快取下一個結點
MyLinkNode* pNext = pCurrent->next;
delete pNext;
pCurrent = pNext;
}
//釋放鏈表記憶體
this->head = NULL;
this->size = 0;
delete this;
}
template
void MyLinkList::Print_LinkList(PRINTLINKNODE print) {
if(this == NULL) return;
//定義輔助指標變數
MyLinkNode* pCurrent = this->head->next;
for(int i = 0;i < this->size;i++) {
print(pCurrent->data);
pCurrent = pCurrent->next;
}
}
- main.cpp的內容
#include <ostream>
#include "MyLinkList.cpp"
class Person {
public:
string name;
int age;
int score;
Person(const string &name, int age, int score) : name(name), age(age), score(score) {}
};
void MyPrint(void* data) {
Person* p = (Person*)data;
cout<<p->name<<"\t"<<p->age<<"\t"<<p->score<<endl;
}
int main() {
MyLinkList<Person> list;
list = list.Init_LinkList();
//創建資料
Person p1("aaa",23,80);
Person p2("bbb",24,81);
Person p3("ccc",25,82);
Person p4("ddd",26,83);
Person p5("eee",27,84);
//插入
list.Insert_LinkList(1,&p1);
list.Insert_LinkList(2,&p2);
list.Insert_LinkList(3,&p3);
list.Insert_LinkList(4,&p4);
list.Insert_LinkList(5,&p5);
//輸出
list.Print_LinkList(MyPrint);
cout<<"================"<<endl;
MyPrint(list.getElem(3).data);
//銷毀鏈表
list.FreeSpace_LinkList();
return 0;
}
- 輸出結果
aaa 23 80
bbb 24 81
ccc 25 82
ddd 26 83
eee 27 84
================
ccc 25 82
Process finished with exit code 0
6、使用java語言來實作單鏈表的基本操作
- MyLinkNode類的撰寫:
package com.xgp.單鏈表;
public class MyLinkNode<T> {
T data; //存放T型別的資料
MyLinkNode<T> next; //下一個結點的資料地址
@Override
public String toString() {
return "MyLinkNode{" +
"data="https://www.cnblogs.com/xgp123/p/+ data +'}';
}
}
- MyLinkList類的撰寫
package com.xgp.單鏈表;
public interface MyLinkList<T> {
//初始化鏈表
MyLinkList Init_LinkList();
//插入錯作
void Insert_LinkList(int pos,T data);
//頭插法建立整數型單鏈表
MyLinkList List_HeadInsert(int size);
//尾插法
MyLinkList List_TailInsert(int size);
//按序號查找
MyLinkNode<T> getElem(int pos);
//按值查找
int Find_LinkList(T data);
//洗掉指定位置的值
void RemoveByPos_LinkList(int pos);
//獲得鏈表的長度
int Size_LinkList();
//釋放鏈表記憶體
void FreeSpace_LinkList();
//列印
void Print_LinkList();
}
- MyLinkListImpl類的撰寫
package com.xgp.單鏈表;
import java.util.Scanner;
public class MyLinkListImpl<T> implements MyLinkList<T> {
private MyLinkNode<T> head; //頭結點
private int size; //大小
@Override
public MyLinkList Init_LinkList() {
MyLinkNode<T> node = new MyLinkNode<>();
node.data = https://www.cnblogs.com/xgp123/p/null;
node.next = null;
this.head = node;
this.size = 0;
return this;
}
@Override
public void Insert_LinkList(int pos, T data) {
if(data == null) return;
if(pos < 1 || pos > this.size + 1) return;
MyLinkNode newNode = new MyLinkNode<>();
newNode.data = data;
newNode.next = null;
MyLinkNode pCurrent = this.head;
for(int i = 1;i < pos;i++) {
pCurrent = pCurrent.next;
}
newNode.next = pCurrent.next;
pCurrent.next = newNode;
this.size++;
}
@Override
public MyLinkList List_HeadInsert(int size) {
Scanner scanner = new Scanner(System.in);
int x;
for(int i = 1;i <= size;i++) {
x = scanner.nextInt();
MyLinkNode newNode = new MyLinkNode();
newNode.data = x;
newNode.next = this.head.next;
this.head.next = newNode;
this.size++;
}
return this;
}
@Override
public MyLinkList List_TailInsert(int size) {
Scanner scanner = new Scanner(System.in);
int x;
//尋找到最后一個結點
MyLinkNode pCurrent = this.head;
for(int i = 1;i <= this.size;i++) {
pCurrent = pCurrent.next;
}
for(int i = 1;i <= size;i++) {
x = scanner.nextInt();
MyLinkNode newNode = new MyLinkNode();
newNode.data = x;
newNode.next = null;
pCurrent.next = newNode;
pCurrent = pCurrent.next;
this.size++;
}
return this;
}
@Override
public MyLinkNode getElem(int pos) {
if(pos < 1 || pos > this.size) return null;
//找該結點
MyLinkNode pCurrent = this.head;
for(int i = 1;i <= pos;i++) {
pCurrent = pCurrent.next;
}
return pCurrent;
}
@Override
public int Find_LinkList(T data) {
if(data == null) return -1;
//找該結點
MyLinkNode pCurrent = this.head;
for(int i = 1;i <= this.size;i++) {
pCurrent = pCurrent.next;
if(pCurrent.data == data) {
return i;
}
}
return 0;
}
@Override
public void RemoveByPos_LinkList(int pos) {
if(pos < 1 || pos > this.size) return;
//找到該結點的前一個結點
MyLinkNode pCurrent = this.head;
for(int i = 1;i < pos;i++) {
pCurrent = pCurrent.next;
}
//洗掉結點
MyLinkNode saveNode = pCurrent.next;
pCurrent.next = pCurrent.next.next;
saveNode.data = null;
saveNode.next = null;
this.size--;
System.gc();
}
@Override
public int Size_LinkList() {
return this.size;
}
@Override
public void FreeSpace_LinkList() {
this.head = null;
this.size = 0;
System.gc();
}
@Override
public void Print_LinkList() {
MyLinkNode pCurrent = this.head;
for(int i = 1;i <= this.size;i++) {
pCurrent = pCurrent.next;
System.out.println(pCurrent.data);
}
}
}
- Person類的撰寫
package com.xgp.單鏈表;
public class Person {
private String name;
private int age;
private int score;
public Person(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}
- Main類的撰寫
package com.xgp.單鏈表;
public class Main {
public static void main(String[] args) {
MyLinkList<Person> list = new MyLinkListImpl<>();
list.Init_LinkList();
//創建資料
Person p1 = new Person("aaa",23,80);
Person p2 = new Person("bbb",24,81);
Person p3 = new Person("ccc",25,82);
Person p4 = new Person("ddd",26,83);
Person p5 = new Person("eee",27,84);
list.Insert_LinkList(1,p1);
list.Insert_LinkList(2,p2);
list.Insert_LinkList(3,p3);
list.Insert_LinkList(4,p4);
list.Insert_LinkList(5,p5);
list.Print_LinkList();
System.out.println("===================");
list.RemoveByPos_LinkList(3);
list.Print_LinkList();
list.FreeSpace_LinkList();
}
}
- 輸出結果
Person{name='aaa', age=23, score=80}
Person{name='bbb', age=24, score=81}
Person{name='ccc', age=25, score=82}
Person{name='ddd', age=26, score=83}
Person{name='eee', age=27, score=84}
===================
Person{name='aaa', age=23, score=80}
Person{name='bbb', age=24, score=81}
Person{name='ddd', age=26, score=83}
Person{name='eee', age=27, score=84}
行程完成,退出碼 0
7、使用javaScript語言來實作單鏈表的基本操作
- MyLinkList.js檔案中的內容
class Person {
constructor(name,age,score) {
this.name = name;
this.age = age;
this.score = score;
}
print() {
return "name:" + this.name + ",age: " + this.age + ",score:" + this.score;
}
}
//創建結點類
class LinkNode {
}
class LinkList {
//初始化鏈表
Init_LinkList() {
var node = new LinkNode();
node.data = https://www.cnblogs.com/xgp123/p/null;
node.next = null;
this.head = node;
this.size = 0;
return this;
}
//插入錯作
Insert_LinkList(pos,data) {
if(data == null) return;
if(pos < 1 || pos > this.size + 1) return;
//建立新結點
var newNode = new LinkNode();
newNode.data = data;
newNode.next = null;
//建立輔助指標
var pCurrent = this.head;
for(var i = 1;i < pos;i++) {
pCurrent = pCurrent.next;
}
//遍歷結束后,輔助指標指向的是pos-1
newNode.next = pCurrent.next;
pCurrent.next = newNode;
this.size++;
}
//頭插法建立整數型單鏈表
List_HeadInsert(size) {
for(var i = 1;i <= size;i++) {
var newNode = new LinkNode();
newNode.data = i;
newNode.next = this.head.next;
this.head.next = newNode;
this.size++;
}
return this;
}
//尾插法
List_TailInsert(size) {
//建立輔助指標,指向最后一個元素
var pCurrent = this.head;
for(var i = 1;i <= this.size;i++) {
pCurrent = pCurrent.next;
}
for(var i = 1;i <= size;i++) {
var newNode = new LinkNode();
newNode.data = i;
newNode.next = null;
pCurrent.next = newNode;
pCurrent = pCurrent.next;
this.size++;
}
return this;
}
//按序號查找
getElem(pos) {
if(pos < 1 || pos > this.size) return null;
var pCurrent = this.head;
for(var i = 1;i <= pos;i++) {
pCurrent = pCurrent.next;
}
return pCurrent.data;
}
//按值查找
Find_LinkList(data) {
if(data == null) return -1;
var pCurrent = this.head;
for(var i = 1;i <= this.size;i++) {
pCurrent = pCurrent.next;
if(pCurrent.data == data) {
return i;
}
}
return 0;
}
//洗掉指定位置的值
RemoveByPos_LinkList(pos) {
if(pos < 1 || pos > this.size) return null;
var pCurrent = this.head;
//找到前一個結點
for(var i = 1;i < pos;i++) {
pCurrent = pCurrent.next;
}
var saveNode = pCurrent.next;
pCurrent.next = saveNode.next;
saveNode.next = null;
this.size--;
}
//獲得鏈表的長度
Size_LinkList() {
if(this == null) return -1;
return this.size;
}
//釋放鏈表記憶體
FreeSpace_LinkList() {
this.head = null;
this.size = 0;
delete this;
}
//列印
Print_LinkList() {
var pCurrent = this.head;
// var str ="";
for(var i = 1;i <= this.size;i++) {
pCurrent = pCurrent.next;
// console.log(pCurrent.data);
console.log(pCurrent.data.print());
}
// console.log(str);
}
}
- MyLinkList.html 檔案中的內容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://www.cnblogs.com/xgp123/p/MyLinkList.js"></script>
</head>
<body>
<script>
var list = new LinkList();
list.Init_LinkList();
//創建資料
var p1 = new Person("aaa",23,80);
var p2 = new Person("bbb",24,81);
var p3 = new Person("ccc",25,82);
var p4 = new Person("ddd",26,83);
var p5 = new Person("eee",27,84);
//插入資料
list.Insert_LinkList(1,p1);
list.Insert_LinkList(2,p2);
list.Insert_LinkList(3,p3);
list.Insert_LinkList(4,p4);
list.Insert_LinkList(5,p5);
//列印
list.Print_LinkList();
console.log(list.Size_LinkList());
console.log(list.getElem(3));
console.log(list.Find_LinkList(p4));
console.log("==========================");
list.RemoveByPos_LinkList(2);
list.Print_LinkList();
//銷毀
list.FreeSpace_LinkList();
</script>
</body>
</html>
- 輸出結果
name:aaa,age: 23,score:80 MyLinkList.js:135:25
name:bbb,age: 24,score:81 MyLinkList.js:135:25
name:ccc,age: 25,score:82 MyLinkList.js:135:25
name:ddd,age: 26,score:83 MyLinkList.js:135:25
name:eee,age: 27,score:84 MyLinkList.js:135:25
5 MyLinkList.html:30:17
Object { name: "ccc", age: 25, score: 82 }
MyLinkList.html:32:17
4 MyLinkList.html:34:17
========================== MyLinkList.html:36:17
name:aaa,age: 23,score:80 MyLinkList.js:135:25
name:ccc,age: 25,score:82 MyLinkList.js:135:25
name:ddd,age: 26,score:83 MyLinkList.js:135:25
name:eee,age: 27,score:84 MyLinkList.js:135:25
8、使用Python語言來實作單鏈表的基本操作
- MyLinkList.py 檔案的內容撰寫
# 定義一個Person類
class Person:
def __init__(self,name,age,score):
self.name = name
self.age = age
self.score = score
def toString(self):
print("name: ",self.name,",age:",self.age,",score:",self.score)
class LinkNode:
pass
class LinkList:
# 初始化鏈表
def Init_LinkList(self):
node = LinkNode()
node.data = https://www.cnblogs.com/xgp123/p/None
node.next = None
self.head = node
self.size = 0
return self
# 插入錯作
def Insert_LinkList(self,pos,data):
if(data == None):
return
if(pos < 1 or pos > self.size + 1):
return
# 創立待插入的新節點
newNode = LinkNode()
newNode.data = data
newNode.next = None
# 輔助指標
pCurrent = self.head
for i in range(1,pos):
pCurrent = pCurrent.next
# 進行插入
newNode.next = pCurrent.next
pCurrent.next = newNode
self.size += 1
# 頭插法建立整數型單鏈表
def List_HeadInsert(self,size):
for i in range(1,size + 1):
newNode = LinkNode()
newNode.data = i
newNode.next = self.head.next
self.head.next = newNode
self.size += 1
return self
# 尾插法
def List_TailInsert(self,size):
pCurrent = self.head
for i in range(1,self.size + 1):
pCurrent = pCurrent.next
for i in range(1,size + 1):
newNode = LinkNode()
newNode.data = i
newNode.next = None
pCurrent.next = newNode
pCurrent = pCurrent.next
self.size += 1
return self
# 按序號查找
def getElem(self,pos):
if(pos < 1 or pos > self.size):
return None
pCurrent = self.head
for i in range(1,pos+1):
pCurrent = pCurrent.next
return pCurrent.data
# 按值查找
def Find_LinkList(self,data):
if(data == None):
return -1
pCurrent = self.head
for i in range(1,self.size + 1):
pCurrent = pCurrent.next
if(pCurrent.data == data):
return i
return 0
# 洗掉指定位置的值
def RemoveByPos_LinkList(self,pos):
if(pos < 1 or pos > self.size):
return None
pCurrent = self.head
for i in range(1,pos):
pCurrent = pCurrent.next
saveNode = pCurrent.next
pCurrent.next = saveNode.next
saveNode.next = None
self.size -= 1
# 獲得鏈表的長度
def Size_LinkList(self):
if(self == None):
return -1
return self.size
# 釋放鏈表記憶體
def FreeSpace_LinkList(self):
self.head = None
self.size = 0
# 列印
def Print_LinkList(self):
pCurrent = self.head
for i in range(1,self.size + 1):
pCurrent = pCurrent.next
p = pCurrent.data
p.toString()
- main.py檔案內容的撰寫
from MyLinkList import *
list = LinkList()
list.Init_LinkList();
# 創建資料
p1 = Person("aaa", 23, 80)
p2 = Person("bbb", 24, 81)
p3 = Person("ccc", 25, 82)
p4 = Person("ddd", 26, 83)
p5 = Person("eee", 27, 84)
# 插入資料
list.Insert_LinkList(1, p1)
list.Insert_LinkList(2, p2)
list.Insert_LinkList(3, p3)
list.Insert_LinkList(4, p4)
list.Insert_LinkList(5, p5)
# 列印
list.Print_LinkList()
print(list.Size_LinkList())
print(list.getElem(3))
print(list.Find_LinkList(p4))
print("=================")
list.RemoveByPos_LinkList(2)
list.Print_LinkList()
list.FreeSpace_LinkList()
- 輸出結果
name: aaa ,age: 23 ,score: 80
name: bbb ,age: 24 ,score: 81
name: ccc ,age: 25 ,score: 82
name: ddd ,age: 26 ,score: 83
name: eee ,age: 27 ,score: 84
5
<MyLinkList.Person object at 0x039050B0>
4
=================
name: aaa ,age: 23 ,score: 80
name: ccc ,age: 25 ,score: 82
name: ddd ,age: 26 ,score: 83
name: eee ,age: 27 ,score: 84
Process finished with exit code 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/205852.html
標籤:其他
上一篇:鏈表
下一篇:詳細講解Codeforces Round #624 (Div. 3) E. Construct the Binary Tree(構造二叉樹)
