热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

五种编程语言解释数据结构与算法—单链表

五种编程语言解释数据结构与算法—单链表目录五种编程语言解释数据结构与算法—单链表1、单链表的定义2、单链表的实现3、单链表的逻辑示意图3.1、第一种逻辑方式:只有头指

五种编程语言解释数据结构与算法—单链表
目录
  • 五种编程语言解释数据结构与算法—单链表
    • 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 = 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 data = &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 next;}for(int i = 0;i data = &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 &#61;&#61; NULL) return NULL;if(pos &#61;&#61; 0) return list->head;if(pos <1 || pos > list->size) return NULL;//找结点//辅助指针变量LinkNode* pCurrent &#61; list->head->next;//遍历查找for(int i &#61; 0; i next;}return pCurrent;
}

按值查找&#xff0c;就是循环遍历整个链表&#xff0c;然后于传入的值进行匹配&#xff0c;如果相等&#xff0c;则返回该结点。

//查找
int Find_LinkList(LinkList* list,void* data) {if(list &#61;&#61; NULL) return -1;if(data &#61;&#61; NULL) return -1;//定义辅助指针LinkNode* pCurrent &#61; list->head->next;for(int i &#61; 1;i <&#61; list->size;i&#43;&#43;) {if(pCurrent->data &#61;&#61; data) {return i;}pCurrent &#61; pCurrent->next;}return -1;
}

这两个查找的算法都为O(n)

4.4、插入新结点的操作

右图可以看出&#xff0c;插入操作以头插法建立单链表的操作几乎一样&#xff0c;只不过在这里是把头结点替换成了任意结点。

//插入
void Insert_LinkList(LinkList* list, int pos,void* data) {if(list &#61;&#61; NULL) return;if(data &#61;&#61; NULL) return;//将用户的从1开始排序&#xff0c;转换成为程序员理解的从0开始排序pos &#61; pos - 1;if(pos <0 || pos > list->size) return;//创建新的结点LinkNode* newNode &#61; (LinkNode*)malloc(sizeof(LinkNode));newNode->data &#61; data;newNode->next &#61; NULL;//找结点//辅助指针变量LinkNode* pCurrent &#61; list->head;for(int i &#61; 0; i next;}//新节点入链表newNode->next &#61; pCurrent->next;pCurrent->next &#61; newNode;list->size&#43;&#43;;}

4.5、删除结点的操作

在单链表中&#xff0c;如果要删除一个结点&#xff0c;只需要将待删除结点的前一个结点指向待删除结点的下一个结点即可。

//删除指定位置的值
void RemoveByPos_LinkList(LinkList* list,int pos) {if(list &#61;&#61; NULL) return;if(pos <1 || pos > list->size) return;//找结点//辅助指针变量LinkNode* pCurrent &#61; list->head;//指向前一个结点for(int i &#61; 1; i next;}//缓存删除的结点LinkNode* pDel &#61; pCurrent->next;pCurrent->next &#61; pDel->next;//释放删除结点的内存free(pDel);list->size--;
}

4.6、完整代码


  1. LinkList.h文件中的内容&#xff0c;该文件内容定义了该单链表具有的方法

    #ifndef XGP_STUDY_DEMO40_LINKLIST_H
    #define XGP_STUDY_DEMO40_LINKLIST_H#include
    #include
    #include //链表结点
    typedef struct LinkNode {void* data; //void* 无类型指针&#xff0c;可以指向任何类型的数据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

  2. LinkList.c文件的内容&#xff0c;该内容是对上述头文件中的方法做具体得实现。

    #include "LinkList.h"//初始化链表LinkList* Init_LinkList() {LinkList* list &#61; (LinkList*)malloc(sizeof(LinkList));list->size &#61; 0;//头节点&#xff0c;不保存数据信息list->head &#61; (LinkNode*)malloc(sizeof(LinkNode));list->head->data &#61; NULL;list->head->next &#61; NULL;return list;
    }//插入
    void Insert_LinkList(LinkList* list, int pos,void* data) {if(list &#61;&#61; NULL) return;if(data &#61;&#61; NULL) return;//将用户的从1开始排序&#xff0c;转换成为程序员理解的从0开始排序pos &#61; pos - 1;if(pos <0 || pos > list->size) return;//创建新的结点LinkNode* newNode &#61; (LinkNode*)malloc(sizeof(LinkNode));newNode->data &#61; data;newNode->next &#61; NULL;//找结点//辅助指针变量LinkNode* pCurrent &#61; list->head;for(int i &#61; 0; i next;}//新节点入链表newNode->next &#61; pCurrent->next;pCurrent->next &#61; newNode;list->size&#43;&#43;;}//头插法建立单链表
    LinkList* List_HeadInsert(int size) {//创建链表LinkList* list &#61; Init_LinkList();//用户输入size个整数int x;scanf("%d\n",&x);LinkNode* newNode &#61; (LinkNode*)malloc(sizeof(LinkNode));for(int i &#61; 0;i data &#61; &x;newNode->next &#61; list->head->next;list->head->next &#61; newNode;list->size&#43;&#43;;}return list;
    }//尾插法
    LinkList* List_TailInsert(int size) {//创建链表LinkList* list &#61; Init_LinkList();//用户输入size个整数int x;scanf("%d\n",&x);LinkNode* newNode &#61; (LinkNode*)malloc(sizeof(LinkNode));//找结点//辅助指针变量LinkNode* pCurrent &#61; list->head;for(int i &#61; 0; i next;}for(int i &#61; 0;i data &#61; &x;newNode->next &#61; NULL;//遍历完后&#xff0c;辅助指针就指向的是最后一个结点pCurrent->next &#61; newNode;pCurrent &#61; pCurrent->next;list->size&#43;&#43;;}return list;
    }//按序号查找
    LinkNode* getElem(LinkList* list,int pos) {if(list &#61;&#61; NULL) return NULL;if(pos &#61;&#61; 0) return list->head;if(pos <1 || pos > list->size) return NULL;//找结点//辅助指针变量LinkNode* pCurrent &#61; list->head->next;//遍历查找for(int i &#61; 0; i next;}return pCurrent;
    }//查找
    int Find_LinkList(LinkList* list,void* data) {if(list &#61;&#61; NULL) return -1;if(data &#61;&#61; NULL) return -1;//定义辅助指针LinkNode* pCurrent &#61; list->head->next;for(int i &#61; 1;i <&#61; list->size;i&#43;&#43;) {if(pCurrent->data &#61;&#61; data) {return i;}pCurrent &#61; pCurrent->next;}return -1;
    }//删除指定位置的值
    void RemoveByPos_LinkList(LinkList* list,int pos) {if(list &#61;&#61; NULL) return;if(pos <1 || pos > list->size) return;//找结点//辅助指针变量LinkNode* pCurrent &#61; list->head;//指向前一个结点for(int i &#61; 1; i next;}//缓存删除的结点LinkNode* pDel &#61; pCurrent->next;pCurrent->next &#61; pDel->next;//释放删除结点的内存free(pDel);list->size--;
    }
    //打印
    void Print_LinkList(LinkList* list,PRINTLINKNODE print) {if(list &#61;&#61; NULL) return;//定义辅助指针变量LinkNode* pCurrent &#61; list->head->next;for(int i &#61; 0;i size;i&#43;&#43;) {print(pCurrent->data);pCurrent &#61; pCurrent->next;}
    }//释放链表内存
    void FreeSpace_LinkList(LinkList* list) {if(list &#61;&#61; NULL) return;//辅助指针变量LinkNode* pCurrent &#61; list->head;for(int i &#61; 0;i <&#61; list->size;i&#43;&#43;) {//缓存下一个结点LinkNode* pNext &#61; pCurrent->next;free(pCurrent);pCurrent &#61; pNext;}//释放链表内存list->size &#61; 0;free(list);}//获得链表的长度
    int Size_LinkList(LinkList* list) {if(list &#61;&#61; NULL)return -1;return list->size;
    }

  3. main.c文件中的内容&#xff0c;该内容的代码是用来测试该单链表中的方法。

    #include "LinkList.h"typedef struct Person {char name[64];int age;int score;
    }Person;void MyPrint(void* data) {Person* p &#61; (Person*)data;printf("Name:%s Age:%d Score:%d\n",p->name,p->age,p->score);
    }int main() {//创建链表LinkNode* list &#61; Init_LinkList();//创建数据Person p1 &#61; {"aaa",23,80};Person p2 &#61; {"bbb",24,81};Person p3 &#61; {"ccc",25,82};Person p4 &#61; {"ddd",26,83};Person p5 &#61; {"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("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;\n");//删除RemoveByPos_LinkList(list,3);Print_LinkList(list,MyPrint);//销毁链表FreeSpace_LinkList(list);return 0;
    }

  4. 测试结果

    Name:bbb Age:24 Score:81
    Name:ccc Age:25 Score:82
    Name:ddd Age:26 Score:83
    Name:eee Age:27 Score:84
    &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
    Name:bbb Age:24 Score:81
    Name:ccc Age:25 Score:82
    Name:eee Age:27 Score:84Process finished with exit code 0


5、使用C&#43;&#43;语言来实现单链表的基本操作


  1. MyLinkList.h文件的内容

#ifndef XGP_STUDY_DEMO43_MYLINKLIST_H
#define XGP_STUDY_DEMO43_MYLINKLIST_H#include
using namespace std;typedef void(*PRINTLINKNODE)(void*);template
class MyLinkNode {
public:T* data; //存放T类型的数据MyLinkNode* next; //下一个结点
};template
class MyLinkList {private:MyLinkNode* 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 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

  1. MyLinkList.cpp文件内容

#include "MyLinkList.h"template
MyLinkList MyLinkList::Init_LinkList() {MyLinkNode* node &#61; new MyLinkNode();node->data &#61; NULL;node->next &#61; NULL;this->head &#61; node;this->size &#61; 0;return *this;
}template
void MyLinkList::Insert_LinkList(int pos, T* data) {if(this &#61;&#61; NULL) return;if(data &#61;&#61; NULL) return;MyLinkNode* newNode &#61; new MyLinkNode();newNode->data &#61; data;newNode->next &#61; NULL;//插入&#xff0c;找到一个指向pos-1的结点来的辅助指针MyLinkNode* pCurrent &#61; this->head;for(int i &#61; 1;i <&#61; pos - 1;i&#43;&#43;) {pCurrent &#61; pCurrent->next;}//循环过后&#xff0c;此时的辅助结点就是插入结点的前一个newNode->next &#61; pCurrent->next;pCurrent->next &#61; newNode;this->size&#43;&#43;;
}template
MyLinkList MyLinkList::List_HeadInsert(int size) {//用户输入size个整数int x;scanf("%d\n",&x);MyLinkNode* newNode &#61; new MyLinkNode();for(int i &#61; 0;i * newNode &#61; new MyLinkNode();scanf("%d\n",&x);newNode->data &#61; &x;newNode->next &#61; this->head->next;this->head->next &#61; newNode;this->size&#43;&#43;;}return *this;
}template
MyLinkList MyLinkList::List_TailInsert(int size) {//用户输入size个整数int x;scanf("%d\n",&x);MyLinkNode* newNode &#61; new MyLinkNode();//找结点//辅助指针变量MyLinkNode* pCurrent &#61; this->head;for(int i &#61; 0; i next;}for(int i &#61; 0;i * newNode &#61; new MyLinkNode;scanf("%d\n",&x);newNode->data &#61; &x;newNode->next &#61; NULL;//遍历完后&#xff0c;辅助指针就指向的是最后一个结点pCurrent->next &#61; newNode;pCurrent &#61; pCurrent->next;this->size&#43;&#43;;}return *this;
}template
MyLinkNode MyLinkList::getElem(int pos) {if(pos <1 || pos >&#61; this->size) new MyLinkNode();MyLinkNode* pCurrent &#61; this->head;//辅助指针for(int i &#61; 1;i <&#61; pos;i&#43;&#43;) {pCurrent &#61; pCurrent->next;}return *pCurrent;
}template
int MyLinkList::Find_LinkList(T data) {if(data &#61;&#61; NULL) return -1;//定义辅助指针变量MyLinkNode* pCurrent &#61; this->head->next;for(int i &#61; 1;i <&#61; this->size;i&#43;&#43;) {if(pCurrent->data &#61;&#61; data) {return i;}pCurrent &#61; pCurrent->next;}return 0;
}template
void MyLinkList::RemoveByPos_LinkList(int pos) {if(this &#61;&#61; NULL) return;if(pos <1 || pos > this->size) return;//找结点//辅助指针变量MyLinkNode* pCurrent &#61; this->head;//指向前一个结点for(int i &#61; 1; i next;}//缓存删除的结点MyLinkNode* pDel &#61; pCurrent->next;pCurrent->next &#61; pDel->next;//释放删除结点的内存delete pDel;this->size--;
}template
int MyLinkList::Size_LinkList() {if(this &#61;&#61; NULL) return -1;return this->size;
}template
void MyLinkList::FreeSpace_LinkList() {//辅助指针变量MyLinkNode* pCurrent &#61; this->head;for(int i &#61; 0;i <&#61; this->size;i&#43;&#43;) {//缓存下一个结点MyLinkNode* pNext &#61; pCurrent->next;delete pNext;pCurrent &#61; pNext;}//释放链表内存this->head &#61; NULL;this->size &#61; 0;delete this;
}template
void MyLinkList::Print_LinkList(PRINTLINKNODE print) {if(this &#61;&#61; NULL) return;//定义辅助指针变量MyLinkNode* pCurrent &#61; this->head->next;for(int i &#61; 0;i size;i&#43;&#43;) {print(pCurrent->data);pCurrent &#61; pCurrent->next;}
}

  1. main.cpp的内容

#include
#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 &#61; (Person*)data;cout<name<<"\t"<age<<"\t"<score<}int main() {MyLinkList list;list &#61; 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<<"&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;"<}

  1. 输出结果

aaa 23 80
bbb 24 81
ccc 25 82
ddd 26 83
eee 27 84
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
ccc 25 82Process finished with exit code 0

6、使用java语言来实现单链表的基本操作


  1. MyLinkNode类的编写&#xff1a;

package com.xgp.单链表;public class MyLinkNode {T data; //存放T类型的数据MyLinkNode next; //下一个结点的数据地址&#64;Overridepublic String toString() {return "MyLinkNode{" &#43;"data&#61;" &#43; data &#43;&#39;}&#39;;}
}

  1. MyLinkList类的编写

package com.xgp.单链表;public interface MyLinkList {//初始化链表MyLinkList Init_LinkList();//插入错作void Insert_LinkList(int pos,T data);//头插法建立整数型单链表MyLinkList List_HeadInsert(int size);//尾插法MyLinkList List_TailInsert(int size);//按序号查找MyLinkNode getElem(int pos);//按值查找int Find_LinkList(T data);//删除指定位置的值void RemoveByPos_LinkList(int pos);//获得链表的长度int Size_LinkList();//释放链表内存void FreeSpace_LinkList();//打印void Print_LinkList();
}

  1. MyLinkListImpl类的编写

package com.xgp.单链表;import java.util.Scanner;public class MyLinkListImpl implements MyLinkList {private MyLinkNode head; //头结点private int size; //大小&#64;Overridepublic MyLinkList Init_LinkList() {MyLinkNode node &#61; new MyLinkNode<>();node.data &#61; null;node.next &#61; null;this.head &#61; node;this.size &#61; 0;return this;}&#64;Overridepublic void Insert_LinkList(int pos, T data) {if(data &#61;&#61; null) return;if(pos <1 || pos > this.size &#43; 1) return;MyLinkNode newNode &#61; new MyLinkNode<>();newNode.data &#61; data;newNode.next &#61; null;MyLinkNode pCurrent &#61; this.head;for(int i &#61; 1;i getElem(int pos) {if(pos <1 || pos > this.size) return null;//找该结点MyLinkNode pCurrent &#61; this.head;for(int i &#61; 1;i <&#61; pos;i&#43;&#43;) {pCurrent &#61; pCurrent.next;}return pCurrent;}&#64;Overridepublic int Find_LinkList(T data) {if(data &#61;&#61; null) return -1;//找该结点MyLinkNode pCurrent &#61; this.head;for(int i &#61; 1;i <&#61; this.size;i&#43;&#43;) {pCurrent &#61; pCurrent.next;if(pCurrent.data &#61;&#61; data) {return i;}}return 0;}&#64;Overridepublic void RemoveByPos_LinkList(int pos) {if(pos <1 || pos > this.size) return;//找到该结点的前一个结点MyLinkNode pCurrent &#61; this.head;for(int i &#61; 1;i saveNode &#61; pCurrent.next;pCurrent.next &#61; pCurrent.next.next;saveNode.data &#61; null;saveNode.next &#61; null;this.size--;System.gc();}&#64;Overridepublic int Size_LinkList() {return this.size;}&#64;Overridepublic void FreeSpace_LinkList() {this.head &#61; null;this.size &#61; 0;System.gc();}&#64;Overridepublic void Print_LinkList() {MyLinkNode pCurrent &#61; this.head;for(int i &#61; 1;i <&#61; this.size;i&#43;&#43;) {pCurrent &#61; pCurrent.next;System.out.println(pCurrent.data);}}
}

  1. 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 &#61; name;this.age &#61; age;this.score &#61; score;}&#64;Overridepublic String toString() {return "Person{" &#43;"name&#61;&#39;" &#43; name &#43; &#39;\&#39;&#39; &#43;", age&#61;" &#43; age &#43;", score&#61;" &#43; score &#43;&#39;}&#39;;}
}

  1. Main类的编写

package com.xgp.单链表;public class Main {public static void main(String[] args) {MyLinkList list &#61; new MyLinkListImpl<>();list.Init_LinkList();//创建数据Person p1 &#61; new Person("aaa",23,80);Person p2 &#61; new Person("bbb",24,81);Person p3 &#61; new Person("ccc",25,82);Person p4 &#61; new Person("ddd",26,83);Person p5 &#61; 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("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;");list.RemoveByPos_LinkList(3);list.Print_LinkList();list.FreeSpace_LinkList();}
}

  1. 输出结果

Person{name&#61;&#39;aaa&#39;, age&#61;23, score&#61;80}
Person{name&#61;&#39;bbb&#39;, age&#61;24, score&#61;81}
Person{name&#61;&#39;ccc&#39;, age&#61;25, score&#61;82}
Person{name&#61;&#39;ddd&#39;, age&#61;26, score&#61;83}
Person{name&#61;&#39;eee&#39;, age&#61;27, score&#61;84}
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
Person{name&#61;&#39;aaa&#39;, age&#61;23, score&#61;80}
Person{name&#61;&#39;bbb&#39;, age&#61;24, score&#61;81}
Person{name&#61;&#39;ddd&#39;, age&#61;26, score&#61;83}
Person{name&#61;&#39;eee&#39;, age&#61;27, score&#61;84}进程完成&#xff0c;退出码 0

7、使用Javascript语言来实现单链表的基本操作


  1. MyLinkList.js文件中的内容

class Person {constructor(name,age,score) {this.name &#61; name;this.age &#61; age;this.score &#61; score;}print() {return "name:" &#43; this.name &#43; "&#xff0c;age: " &#43; this.age &#43; "&#xff0c;score:" &#43; this.score;}
}//创建结点类
class LinkNode {}class LinkList {//初始化链表Init_LinkList() {var node &#61; new LinkNode();node.data &#61; null;node.next &#61; null;this.head &#61; node;this.size &#61; 0;return this;}//插入错作Insert_LinkList(pos,data) {if(data &#61;&#61; null) return;if(pos <1 || pos > this.size &#43; 1) return;//建立新结点var newNode &#61; new LinkNode();newNode.data &#61; data;newNode.next &#61; null;//建立辅助指针var pCurrent &#61; this.head;for(var i &#61; 1;i this.size) return null;var pCurrent &#61; this.head;for(var i &#61; 1;i <&#61; pos;i&#43;&#43;) {pCurrent &#61; pCurrent.next;}return pCurrent.data;}//按值查找Find_LinkList(data) {if(data &#61;&#61; null) return -1;var pCurrent &#61; this.head;for(var i &#61; 1;i <&#61; this.size;i&#43;&#43;) {pCurrent &#61; pCurrent.next;if(pCurrent.data &#61;&#61; data) {return i;}}return 0;}//删除指定位置的值RemoveByPos_LinkList(pos) {if(pos <1 || pos > this.size) return null;var pCurrent &#61; this.head;//找到前一个结点for(var i &#61; 1;i }

  1. MyLinkList.html 文件中的内容









  1. 输出结果

name:aaa&#xff0c;age: 23&#xff0c;score:80 MyLinkList.js:135:25
name:bbb&#xff0c;age: 24&#xff0c;score:81 MyLinkList.js:135:25
name:ccc&#xff0c;age: 25&#xff0c;score:82 MyLinkList.js:135:25
name:ddd&#xff0c;age: 26&#xff0c;score:83 MyLinkList.js:135:25
name:eee&#xff0c;age: 27&#xff0c;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
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; MyLinkList.html:36:17
name:aaa&#xff0c;age: 23&#xff0c;score:80 MyLinkList.js:135:25
name:ccc&#xff0c;age: 25&#xff0c;score:82 MyLinkList.js:135:25
name:ddd&#xff0c;age: 26&#xff0c;score:83 MyLinkList.js:135:25
name:eee&#xff0c;age: 27&#xff0c;score:84 MyLinkList.js:135:25

8、使用Python语言来实现单链表的基本操作


  1. MyLinkList.py 文件的内容编写

# 定义一个Person类
class Person:def __init__(self,name,age,score):self.name &#61; nameself.age &#61; ageself.score &#61; scoredef toString(self):print("name: ",self.name,"&#xff0c;age:",self.age,"&#xff0c;score:",self.score)class LinkNode:passclass LinkList:# 初始化链表def Init_LinkList(self):node &#61; LinkNode()node.data &#61; Nonenode.next &#61; Noneself.head &#61; nodeself.size &#61; 0return self# 插入错作def Insert_LinkList(self,pos,data):if(data &#61;&#61; None):returnif(pos <1 or pos > self.size &#43; 1):return# 创立待插入的新节点newNode &#61; LinkNode()newNode.data &#61; datanewNode.next &#61; None# 辅助指针pCurrent &#61; self.headfor i in range(1,pos):pCurrent &#61; pCurrent.next# 进行插入newNode.next &#61; pCurrent.nextpCurrent.next &#61; newNodeself.size &#43;&#61; 1# 头插法建立整数型单链表def List_HeadInsert(self,size):for i in range(1,size &#43; 1):newNode &#61; LinkNode()newNode.data &#61; inewNode.next &#61; self.head.nextself.head.next &#61; newNodeself.size &#43;&#61; 1return self# 尾插法def List_TailInsert(self,size):pCurrent &#61; self.headfor i in range(1,self.size &#43; 1):pCurrent &#61; pCurrent.nextfor i in range(1,size &#43; 1):newNode &#61; LinkNode()newNode.data &#61; inewNode.next &#61; NonepCurrent.next &#61; newNodepCurrent &#61; pCurrent.nextself.size &#43;&#61; 1return self# 按序号查找def getElem(self,pos):if(pos <1 or pos > self.size):return NonepCurrent &#61; self.headfor i in range(1,pos&#43;1):pCurrent &#61; pCurrent.nextreturn pCurrent.data# 按值查找def Find_LinkList(self,data):if(data &#61;&#61; None):return -1pCurrent &#61; self.headfor i in range(1,self.size &#43; 1):pCurrent &#61; pCurrent.nextif(pCurrent.data &#61;&#61; data):return ireturn 0# 删除指定位置的值def RemoveByPos_LinkList(self,pos):if(pos <1 or pos > self.size):return NonepCurrent &#61; self.headfor i in range(1,pos):pCurrent &#61; pCurrent.nextsaveNode &#61; pCurrent.nextpCurrent.next &#61; saveNode.nextsaveNode.next &#61; Noneself.size -&#61; 1# 获得链表的长度def Size_LinkList(self):if(self &#61;&#61; None):return -1return self.size# 释放链表内存def FreeSpace_LinkList(self):self.head &#61; Noneself.size &#61; 0# 打印def Print_LinkList(self):pCurrent &#61; self.headfor i in range(1,self.size &#43; 1):pCurrent &#61; pCurrent.nextp &#61; pCurrent.datap.toString()

  1. main.py文件内容的编写

from MyLinkList import *list &#61; LinkList()
list.Init_LinkList();# 创建数据
p1 &#61; Person("aaa", 23, 80)
p2 &#61; Person("bbb", 24, 81)
p3 &#61; Person("ccc", 25, 82)
p4 &#61; Person("ddd", 26, 83)
p5 &#61; 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("&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;")
list.RemoveByPos_LinkList(2)
list.Print_LinkList()list.FreeSpace_LinkList()

  1. 输出结果

name: aaa &#xff0c;age: 23 &#xff0c;score: 80
name: bbb &#xff0c;age: 24 &#xff0c;score: 81
name: ccc &#xff0c;age: 25 &#xff0c;score: 82
name: ddd &#xff0c;age: 26 &#xff0c;score: 83
name: eee &#xff0c;age: 27 &#xff0c;score: 84
5

4
&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
name: aaa &#xff0c;age: 23 &#xff0c;score: 80
name: ccc &#xff0c;age: 25 &#xff0c;score: 82
name: ddd &#xff0c;age: 26 &#xff0c;score: 83
name: eee &#xff0c;age: 27 &#xff0c;score: 84Process finished with exit code 0


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了使用Python根据字典中的值进行排序的方法,并给出了实验结果。通过将字典转化为记录项,可以按照字典中的值进行排序操作。实验结果显示,按照值进行排序后的记录项为[('b', 2), ('a', 3)]。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
author-avatar
chen
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有