回顾知识——单链表的实现

  链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

1 typedef int ElemType;
2 typedef struct LNode {
3     ElemType data;
4     struct LNode *next;
5 }LNode,*LinkList;

单链表的储存结构

 1 //单链表的初始化
 2 LinkList InitList() {
 3     LinkList list;
 4     list = new LNode;
 5     list->next = NULL;
 6     list->data = 0;
 7     return list;
 8 }
 9 //节点初始化
10 LNode* InitNode(ElemType value) {
11     LNode *node;
12     node = new LNode;
13     node->data = value;
14     node->next = NULL;
15     return node;
16 }

单链表的初始化

 1 //往单链表头部插入节点
 2 void push_front(LinkList &list, LNode* node) {
 3     LinkList temp;
 4     temp = list->next;
 5     list->next = node;
 6     list->next->next = temp;
 7 }
 8 //往单链表的尾部插入节点
 9 void push_back(LinkList &list, LNode* node) {
10     LinkList temp;
11     temp = list;
12     while (temp->next != NULL)temp = temp->next;
13     temp->next = node;
14 }
15 //根据位置插入节点
16 void Insert(LinkList &list,LNode* node,int index) {
17     int k = 1, ans = 1;
18     LinkList temp;
19     temp = list;
20     while (temp->next != NULL) {
21         temp = temp->next;
22         ans++;
23     }
24         //若插入位置小于或等于1号位,将节点插入链表头部
25     if (index <= 1) {
26         temp = list->next;
27         list->next = node;
28         list->next->next = temp;
29     }
30         //若插入的位置大于或等于最大节点位置,将节点插入链表尾部
31     else if (index >= ans) {
32         temp = list;
33         while (temp->next != NULL)temp = temp->next;
34         temp->next = node;
35     }
36         //根据插入位置index,将节点插入链表中
37     else {
38         LinkList p;
39         temp = list;
40         while (k < index) {
41             k++;
42             temp = temp->next;
43         }
44         p = temp->next;
45         temp->next = node;
46         temp->next->next = p;
47     }
48 }    

单链表的节点插入

 1 //删除第一个节点
 2 void pop_front(LinkList &list) {
 3     LinkList temp = list;
 4     temp = temp->next->next;
 5     delete list->next;
 6     list->next = temp;
 7 }
 8 //删除最后一个节点
 9 void pop_back(LinkList &list) {
10     LinkList temp = list;
11     while (temp->next->next != NULL)
12             temp = temp->next;
13     delete temp->next;
14     temp->next = NULL;
15 }
16 //根据节点位置删除
17 void remove(LinkList &list, int index) {
18     int k = 1, ans = 1;
19     LinkList temp;
20     temp = list;
21     while (temp->next != NULL) {
22         temp = temp->next;
23         ans++;
24     }
25     if (index <= 1)
26         pop_front(list);
27     else if (index >= ans)
28         pop_back(list);
29     else {
30         LinkList p;
31         temp = list;
32         while (k < index) {
33             k++;
34             temp = temp->next;
35         }
36         p = temp->next->next;
37         delete temp->next;
38         temp->next = p;
39     }
40 }
41 //删除全部节点
42 void clear(LinkList &list) {
43     LinkList temp = list;
44     if (temp->next == NULL)return;
45     pop_front(list);
46     clear(list);
47 }    

单链表的节点删除

 1 void reverse(LinkList &list) {
 2     LinkList temp, p= InitList();
 3     p = list->next;
 4     list->next = NULL;
 5     while (p) {
 6         temp = p->next;
 7         p->next = list->next;
 8         list->next = p;
 9         p = temp;
10     }
11 }

单链表的翻转

 1 bool isLoop(LinkList list) {
 2     LinkList p = list, q = list;
 3     while (p != NULL && p->next != NULL)
 4     {
 5         p = p->next->next;
 6         q = q->next;
 7         //如果有环,则p会超过q一圈
 8         if (p == q)
 9             break;
10     }
11     if (p == NULL || p->next == NULL)
12         return false;
13     else
14         return true;
15 }

单链表是否有环

  链表是数据结构的基础,掌握链表的操作对后面的数据结构的理解很有帮助的。

  翻以前的知识忘得也差不多了,知识点也是很模糊,现在回顾一下以前的知识和代码,顺便记录知识回顾路程,太久没敲过代码,难免有些生疏,可能有些不太正确的地方,还望看客纠正。对于翻转以及判断是否有环这两个可以用IDE调试一下,单步调试走多几圈就能理解为什么这么写了。

时间: 2024-11-06 15:50:24

回顾知识——单链表的实现的相关文章

数据结构 队列(带尾节点的单链表实现) 回顾练习

带尾节点的单链表队列 入队0(1) 出队0(1) 1 #!/usr/bin/env python3 2 3 class QueueUnderflow(ValueError): 4 pass 5 6 class Node(object): 7 def __init__(self, elem, next_=None): 8 self.elem = elem 9 self.next = next_ 10 11 #queue_list 12 class LQueue(object): 13 def __

数据结构 单链表反转 回顾练习

之前写了一个单链表反转,但是使用的新的空间. 这次的反转是不修改原来的结构,直接将节点内的元素进行修改 1 #!/usr/bin/env python3 2 3 class LNode(object): 4 def __init__(self, elem, next_=None): 5 self.elem = elem 6 self.next = next_ 7 8 class ListError(Exception): 9 pass 10 11 class LList(object): 12

[c语言]单链表的实现

一.基础知识:链表(线性表的链式存储结构) (1)特点:逻辑关系相邻,物理位置不一定相邻. (2)分类: a.不带头节点 b.带头节点 (3)单链表的存储结构: typedef struct SListNode {  DataType data;  struct SListNode* next; }SListNode; 二.代码实现(因避开使用二级指针,所以代码中使用了c++中的引用):此处构造的为不带头节点的链表 (1)sList.h   #pragma once typedef int Da

JAVA实现具有迭代器的线性表(单链表)

一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用到依次遍历单链表中的每一个元素.一般而言,我们就是用for循环来实现遍历,这样,当你新增一个对单链表的操作并需要使用遍历时,你就得重新写一个for循环而实现遍历.那么,为什么不将迭代(遍历)作为一种基本的ADT操作(基本的ADT操作如:新增一个元素.删除一个元素)呢?于是,迭代器就出场了. 2,鉴于

C/C++——单链表的主要功能实现

恰好在复习C/C++,也重新回顾了一下链表,温故而知新,还是有挺大收获的. 1 /**************************** 2 * 单链表 3 * Author: 玉做的树 4 * 5 * Node* create() 根据输入创建链表 6 * Node* create(int []) 根据数组创建链表 7 * const int length(Node *head) 测长 8 * void print(Node* head) 输出链表 9 * Node* push_back(N

单链表 知识点学习--Android地基系列(一)

嗯,看别人整理过,自己再做的笔记,题目都是常见的必考题目,嘻嘻嘻,单链 表的基础知识我就不写了,太多人写了. 看前注意!!!!!!!涉及C知识较多,C知识我以后再考虑是否写一篇附加文 可以辅助以后的Android必备地基系列博文 struct ListNode { int data; ListNode * Next; }; 1.求链表中结点个数 思路:若链表为空,返回0:循环判断链表下一个指针是否为空,no,长度++(初始化用unsigned int  length = 0),直到下一个为nul

对于&quot;单链表逆置和递归&quot;的问题的理解.

一. 相关知识要点: 学习或了解基础数据结构和C语言, 对基础链表知识或相关知识有概况性认识. 例如: 本题目结构为: 1 #define elem_type int 2 3 typedef struct _single_list { 4 elem_type data; //所存的数据元素 5 _single_list *next; //所存的指针元素 6 }ListNode; 二. 问题的思考过程(本题以3种不同的方法解决): <1>类似于我们学习的C语言基础知识中的冒泡排序(参考C程序设计

「C语言」单链表/双向链表的建立/遍历/插入/删除

最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合,一种面向过程的MVC的感觉. 而这一切的基础就在于对链表的创建.删除.输出.写入文件.从文件读出...... 本篇文章在于巩固链表的基础知识(整理自<C语言程序设计教程--人民邮电出版社>第十章),只对链表的概念及增删改查作出探讨,欢迎指教. 一.链表结构和静态/动态链表 二.单链表的建立与遍历

两个单链表的合并,并排序

/*先看看单链表的知识很快就能做出来 这个用三个结构体指针,两个p1,p2指向建立的链表,一个p3指向新的链表判断判断p1p2指向的数据那个小,小的赋值给p3->next(升序),小的那个p1(p2)下移一个赋值顺序要搞对,要不然指向有误 */ #include<stdlib.h>#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node *next;}lnode,*l