单链表 使用哑结点避免特殊情况 利大于弊?

哑结点,就是链表的根节点.   一般的, 单链表的插入要考虑空链表的处理, 但如果有哑结点, 就无需这样考虑.

那这样好吗?

如果这样,你需要保证进入插入函数前, 单链表有哑结点,  所以你需要创建,  而且每次操作单链表需要跳过哑结点.   也就是说,  增加哑结点并没有减少特殊情况的处理,  相反, 这些处理分散到其他函数里.     我认为, 为了提高模块的独立性,   应该把空链表处理补上.

时间: 2024-12-20 18:19:59

单链表 使用哑结点避免特殊情况 利大于弊?的相关文章

C语言实现单链表(带头结点)的基本操作

我在之前一篇博客<C语言实现单链表(不带头结点)的基本操作>中具体实现了不带头结点的单链表的11种操作:如计算链表长度.初始化.创建链表.清空链表等等.但是在实际使用中,带头结点的单链表往往比不带头结点的单链表用的更多,使用也更为方便.因为不用单独考虑第一个节点的情况了,第一个节点和其他后续节点的处理全都一样了,简化操作.这篇博客将会来实现带头结点的单链表的11种操作.代码上传至: https://github.com/chenyufeng1991/LinkedList_HeadNode  .

浅谈单链表有头结点和无头节点

有头结点的链表统一了算法的实现,无头节点减少了节点个数,但是只有根据实际情况选用真正的有无头节点链表 待续://代码实现 待续://代码实现 待续://代码实现

对带头结点的单链表的简单操作

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<memory.h> #define DataType int           //int 可以改写为其它数据类型 typedef struct Node { DataType data; struct Node *next; }Node,*pNode;          //定义结点结构体      

时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和做法. 如图所示,删除结点 i,那么只需找到 i 的前驱 h,然后连 h 到 j,再销毁i 即可.虽然可以安全的删除 i 结点,但是是顺序查找找到 i,之后删除,时间复杂度是 O(n)级别的.具体做法就是:顺序查找整个单链表,找到要删除结点 i 的直接前驱 h,把 h额 next 指向i 的 nex

查找单链表中的倒数第m个结点

例4,设计一个算法求出单链表的倒数第m个结点,要求不得求出链表长度,不得对链表进行逆转,如果找到该结点就返回它的地址,否则就返回NULL. [分析]该题目要求求出单链表的倒数第m个结点,但又不能逆转单链表. 我们知道,获取单链表顺数第i个结点的方式是:设置指针p=head,从头指针开始循环执行p=p->next,一步一步往后移,直到第i个结点为止. 这里我们变动一下,再增加一个指针q,使指针q也沿着链表移动,并且比指针p落后m-1步,当p到达链表尾部时,q刚好指向倒数第m个结点. 具体实现如下:

求两个单链表公共结点

题目:输入两个单链表,找出公共结点. 思路:若两个单链表有公共结点,其形状必定为"Y"型,也就是说公共结点后的所有结点都是相同的. 我们首先获得两个链表的长度,求得长度之差为n,再定义两个指针分别指向两个链表首部,长链表先走n步,然后两个指针同时走,直到两个指针所指向的值完全相同时停止. 代码: /* 求链表公共结点 */ #include<stdio.h> #include<stdlib.h> typedef struct _NODE_ { int data;

删除单链表某个结点(Java版)

题目:删除带头结点的单链表L中的结点p,p不是最后一个结点,要求时间复杂度为O(1). 解题思路: 如果不要求时间复杂度为O(1),我们可以找出p的前驱结点,然后很容易就删除p. 现在要求时间复杂度为O(1),因为p不是最后一个结点,知道结点p我们可以删除p的后继结点,那么我们可以把p的后继结点元素的值赋给p结点元素的值. ADT定义: //单链表的结点类 class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public

删除单链表某个结点

题目:删除带头结点的单链表L中的结点p,p不是最后一个结点,要求时间复杂度为O(1). 解题思路: 如果不要求时间复杂度为O(1),我们可以找出p的前驱结点,然后很容易就删除p. 现在要求时间复杂度为O(1),因为p不是最后一个结点,知道结点p我们可以删除p的后继结点,那么我们可以把p的后继结点元素的值赋给p结点元素的值. ADT定义如下 #define ElemType int typedef struct LNode{ ElemType data; LNode *next; }LNode,*

数据结构基础(8) --单链表的设计与实现(1)之基本操作

链表简介 数组的缺点: 1.元素插入:除了在数组的末尾插入元素之外,在数组的其他任何位置插入元素都需要进行数组元素的频繁移动(插入位置之后的元素都需往后移动), 时间复杂度约为O(N); 2.数组的删除:除了在数组的末尾删除元素之外,在数组的其他任何位置删除元素都需要进行数组元素的频繁移动(删除位置之后的元素都需往前移动), 时间复杂度也为O(N); 链表的特点: 由于在链表中插入/删除元素都不需要进行数据的移位, 只需要O(1)时间完成, 因此链表适用于频繁插入与删除的情况; 但是链表也有缺点