链表
xiao-ren-wu
这个作者很懒,什么都没留下…
展开
-
调试链表函数
//打印单向链表函数void PrintLink(ElemSN *h){ ElemSN *p = NULL; for (p = h; p; p = p->next) { printf("%5d",p->data); } printf("\n");}//释放单向链表函数void FreeLink(ElemSN* h){ Ele原创 2017-07-01 17:00:14 · 744 阅读 · 0 评论 -
复杂链表的复制
问题: 请实现一个函数,复制一个复杂链表,在复杂链表中,每个节点除了有一个指向下一个节点的指针,还有一个指向该链表的任意节点的指针,或者该指针指向NULL。 eg: 复制该链表分为三步: 1.复制原始链表的任意节点,N并创建一个新的节点N’,在把节点连接到N的后面, 2.原始链表上的节点N的sibling指针指向S则,对应的复制节点的N’的silbing指针指向S的复制节点S’原创 2017-11-30 13:05:03 · 353 阅读 · 0 评论 -
判断两个链表是否交叉
判断两个链表是否交叉,如果交叉,返回交叉节点的地址,如果没有交叉,返回NULL 算法思想: 比较两条链表的尾节点,如果节点地址相同,则比较前驱节点的地址,以此类推,直到节点的地址不同或者两条链表比较完毕。 如果出现地址不同,返回该链表节点的后继地址 如果地址相同,说明该两条链表是同一个链表,返回头结点ElemSN* Jud_Same_Node(ElemSN *h1,ElemSN *h2){原创 2017-08-09 16:38:55 · 736 阅读 · 0 评论 -
将一个链表进行降序排列
题目:设head指向一个非空单向链表。将该链表的数据值进行降序排列 算法思路: 通过循环找到链表中的最小值,将最小值从链表中移除,利用头插的方式重新创建一个链表,即得到将序排列的链表。ElemSN* desSort(ElemSN *h){ ElemSN *hn = NULL, *p = NULL, *q = NULL, *pmin = NULL,*qmin=NULL; whil原创 2017-08-08 17:10:29 · 4250 阅读 · 0 评论 -
将奇数节点移动至偶数节点之前
题目:设head 指向一个非空单向链表,将所有奇数节点移动至偶数节点之前 算法思想: 遍历链表的数据域,找到奇数节点,将奇数节点从链表中移除, 重新创建一个“奇数链表” 在将奇数链表头插到原来的链表中ElemSN* moveOddToEvenAhead(ElemSN *h){ ElemSN *p = NULL, *q = NULL, *hn = NULL,*t=NULL;原创 2017-08-08 16:16:58 · 1033 阅读 · 0 评论 -
将链表中数据域为key 的节点删除(链表有重复值)
算法思路: 链表中数据域为key 的节点可能是头结点,和中间尾节点。要分别进行讨论。 删除链表的头结点: 挪头指针, 将节点删除, 将原来指向删除节点的指针指向现在的头结点 删除链表的中间尾节点: 将要删除的链表节点从链表中移除 删掉要删除的节点 将原来指向删除节点的指针指向新位置 注意: 使用两指针联动进行遍历链原创 2017-08-08 15:07:51 · 1120 阅读 · 0 评论 -
链表节点查找
在一个非空单向链表中(数据域的值没有重复)找到值为key的节点, 找到则返回节点的地址,否则返回nullElemSN* FindNode(ElemSN *h,int key){ ElemSN *p; for (p = h; p; p = p->next) { if (p->data == key) { break;原创 2017-08-08 14:12:38 · 1443 阅读 · 0 评论 -
判断一个链表是否有环
#include<stdlib.h>#include<stdio.h>int JudCircle(ElemSN *h){ElemSN **s = NULL, *p = h->next, *q = h;int i = 0, j;s = (ElemSN**)malloc(100 * sizeof(ElemSN*));//创建一个超级大的数组,用来存储链表结点地址while (p&&p->原创 2017-06-26 23:05:58 · 184 阅读 · 0 评论 -
逆序打印链表
算法描述1: 利用两根指针*p,*q, 让指针p表尾, 指针q指向表头 遍历让指针q指向指针p前面的节点, 之后输出指针p的数据域,链表长度减一(p=q) 再次让指针q指向表头,遍历到指针p的前一个元素,输出p的数据域, 重复上述动作,直到指针p指向表头,跳出循环,输出指针p的数据域。void Reserve_Print_Link(ElemSN *h){ ElemSN *p原创 2017-07-01 18:01:51 · 316 阅读 · 0 评论 -
创建单向链表
算法描述1:正向创建单向链表(尾插方式)//创建链表节点typedef struct node{ int data; struct node *next;}ElemSN;//创建单向链表ElemSN* CreatLink(int a[], int n){ int i; ElemSN *ptail = NULL, *p = NULL, *h = NULL;原创 2017-06-30 17:12:06 · 398 阅读 · 0 评论 -
跳表
作用/目的跳表作为一种数据结构通常用于取代平衡树。起因平衡树可以用于表示抽象的数据类型如字典和有序链表,它通过树旋转(Tree Rotation)操作强制使树结构保持平衡来保证节点搜索的效率。在数据为随机插入的情况下,平衡树性能表现良好;但数据为顺序插入或者需要删除节点的情况下,平衡树的性能就会有些糟糕。跳表可以作为平衡树的一种替代选择。它使用随机的平衡策略取代平衡树严格的强制的树平衡策略。因此它具原创 2017-12-07 16:23:28 · 340 阅读 · 0 评论