1.如何判断两个单链表是否相交,如果相交,找出交点(两个链表都不存在环)

如果两个单链表相交,那应该呈“Y”字形,则交点之后的节点是相同的。

所以判断是否相交,只需看两个链表的最后一个节点是否为同一个即可。

假设两个单链表的长度分别为L1、L2(L1 > L2),则(L1-L2)的值就是交汇之前两个链表的长度差;

因此,只有让更长的链表先走L1-L2步,然后两个链表开始一起走,如果某次走到一个相同的节点,该节点即为交点。

typedef struct ListNode{int data;struct ListNode *next;
}ListNode;               //定义节点static int GetListLength(ListNode *head)
{int n=0;while(head != NULL)     {n++;}return n;
}static ListNode * FindCommonNode(ListNode *a,ListNode *b)
{int i;int n1 = GetListLength(a);int n2 = GetListLength(b);//如果a<b,则互换a,b位置重新取长度if(a<b){return FindCommonNode(b,a);}for(i=0;i<n1-n2;i++)  //较长的先走多出长度{a = a->next;}//相同长度时,同时向下走,指向相同时,则为交点while(a != NULL && a != b){a = a->next;b = b->next;}return a;
}

2.判断一个链表是否有环,并找到环的入口点

如果一个单链表有环,那应该呈“6”字形或“O”形。

设置两个指针(fast, slow),初始值都指向头节点,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定 相遇:如果链表是呈"O"字形,则slow刚好遍历完一次的时候,与fast相遇;如果呈“6”字形,则更早相遇。

当fast若与slow相遇时,slow还没有遍历完链表,而fast已经在环内循环了n圈(1<=n)。假设slow走了s步,则 fast走了2s步(fast步数还等于s 加上在环上多转的n圈),设环长为r,则:

2s = s + nr,简化为 s= nr

s = x + y,x为链表起点到环入口点的距离,y是slow在环内走过的距离;

可以得到 x = y - s = y - nr,从链表头、相遇点分别设一个指针(p1, p2),每次各走一步,当p1走过距离x时到达入口点,而p2走过的距离为y-nr,y是相遇点与入口点的距离,因此y也走到了入口点,也就是说p1、p2在环入口点相遇了。

//链表是否有环
static ListNode* FindLoopPort(ListNode* head)
{ListNode* slow = head;ListNode* fast = head;//找相遇节点while(fast != NULL && fast->next != NULL){slow = slow->next;fast = fast->next->next;if(slow == fast)break;}if(fast == NULL || fast->next ==NULL)  //走完链表,无环return NULL;//有环时,此时fast在相遇点,slow设置为起点,再相遇时,为环入口点slow = head;while(slow != fast){slow = slow->next;fast = fast->next;}return slow;
}

3.求一个单链表(无环)的中间节点

设置两个指针(fast, slow),初始值都指向头节点,slow每次前进一步,fast每次前进二步,当fast走到末尾时,slow刚好指向中间节点。

4.假如链表长度为N,如何返回链表的倒数第K个结点

假设用两个指针,指针P1先走K-1步,然后指针P2才开始走,当指针P1遍历完链表时,P2还剩K-1个结点没有遍历,此时,P2为第K个节点,返回P2即可。

//求倒数第n个节点
ListNode *FindLastKNode(ListNode *Head, int n)
{ListNode* p1=head;ListNode* p2=head;while(--n == 0 && p1 != NULL){p1 = p1->next;}if(p1 == NULL) return NULL;while(p1->next != NULL){p2 = p2->next;p1 = p1->next;}return p2;
}

5.如何反转一个单链表(或逆序输出)

static Node* ReverseList(Node* Head)
{Node* pNode = Head;Node* pNext = NULL;Node* pPrev = NULL;while (pNode){pNext = pNode->next;if (NULL == pNext){Head = pNode;}pNode->next = pPrev; //断开原本的链,反转指向pPrev = pNode;       //将逆置后的头,付给pPrev,pPrev始终为逆置后链表的第一位pNode = pNext;       //将节点后推一位,循环反转}return Head;
}//递归实现逆置,此时默认为有头结点的链表Node* reverselist1(Node* head)
{static Node *h = head; //记录头结点 Node *c = NULL;//当遍历到链表结尾部分是,a为倒数第二位,b为倒数第一位if (head == NULL || head->next == NULL)    return head; c = reverselist1(head->next); //开始递归if (head != h)      //没有返回到头结点时,从最后一位依次逆转指向,并把逆转后的节点返回,继续进行逆转{head->next->next = head;head->next = NULL;return c;}else        //返回到头结点时,将已经全部逆置的链表附在头结点后面,完成逆置。返回头结点。{head->next = c;return head;}}

算法精解(三):C语言描述(链表常见问题)相关推荐

  1. 《 算法精解:c语言描述》chm 电子书下载

    本电子书包括基本算法分析原理,基本数据结构.抽象数据结构.递归和树等数据结构知识,选择排序.插入排序.冒泡排序.希尔排序.快速排序方法.归并和归并排序方法.优先队列与堆排序方法.基数排序方法以及特殊用 ...

  2. 资料 | O‘Reilly精品图书系列:算法精解 C 语言描述 (简体中文)

    下载地址:资料 | O'Reilly精品图书系列:算法精解 C 语言描述 (简体中文) 内容简介 · · · · · · 本书是数据结构和算法领域的经典之作,十余年来,畅销不衰! 全书共分为三部分:第 ...

  3. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    转载自  JVM内存管理------GC算法精解(复制算法与标记/整理算法) 本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此 ...

  4. JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法)

    转载自   JVM内存管理------GC算法精解(五分钟教你终极算法---分代搜集算法) 引言 何为终极算法? 其实就是现在的JVM采用的算法,并非真正的终极.说不定若干年以后,还会有新的终极算法, ...

  5. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)

    转载自  JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑 ...

  6. 算法可以用不同的语言描述如果用c语言,【判断题】算法可以用不同的语言描述,如果用C 语言或PASCAL语言等高级语言来描述,则算法实际上就是程序了。...

    [判断题]算法可以用不同的语言描述,如果用C 语言或PASCAL语言等高级语言来描述,则算法实际上就是程序了. 更多相关问题 [判断题] 一个优秀的新闻编辑的能力结构应包括分析问题的能力.引导舆论的能 ...

  7. 算法精解_C语言 链表_单链表(接口定义+类型实现)

    链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操 ...

  8. 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...

    原标题:斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂! "算法会扩展并提高大家的编程技巧,而学习基本的算法设计范式,可以和许多不同领域的不同问题密切相关,还能作为预测算法 ...

  9. 十大经典排序算法详解(三)-堆排序,计数排序,桶排序,基数排序

    养成习惯,先赞后看!!! 你的点赞与关注真的对我非常有帮助.如果可以的话,动动手指,一键三连吧!!! 十大经典排序算法-堆排序,计数排序,桶排序,基数排序 前言 这是十大经典排序算法详解的最后一篇了. ...

  10. 选择排序算法详解之C语言版

    一.算法原理 选择排序属于不稳定排序法,是一种常用的排序算法,其时间复杂度为O(n^2). 所谓的不稳定排序算法是指在一组数据中存在多个相同的数据,但是在排序之后,相同数据的前后位置会发生改变.例如有 ...

最新文章

  1. 以下关于java的GUI菜单描述_第十九讲 菜单和JavaGUI综合设计
  2. Java 垃圾回收算法之G1
  3. c语言经典算法大全pdf,c语言经典算法100例pdf版.pdf
  4. 协作安装程序应用一例
  5. React开发(122):动态表头核心配置 外层绑定key
  6. .Net开源源码查询
  7. Python 带界面的可执行程序
  8. Centos 7 Puppet之foreman介绍安装测试
  9. 轻松使用EasyRecovery恢复丢失照片
  10. c++ 使用nacos_使用SpringBoot和Seata实现Dubbo分布式事务管理
  11. win教程:如何查看本机的IP地址
  12. 按照斗地主的规则,完成洗牌发牌的动作
  13. linux 如何添加用户,Linux 怎么添加用户(adduser)
  14. Guava基本工具包Base:Null和字符串分割(Splitter)、拼接(Joiner)处理
  15. 【微信小程序】上传Word、txt、Excel、PPT等文件
  16. 港星变身“单亲美妈” 陈松伶:中年女演员的舞台不应设限
  17. 当Ubuntu安装软件碰到找不到安装包时E: Package ‘unzip‘ has no installation candidate
  18. 论文篇 | 2020-Facebook-DETR :利用Transformers端到端的目标检测=>翻译及理解(持续更新中)
  19. CAD文件转换为SVG文件
  20. ubuntu18连不上安卓手机的USB网络共享

热门文章

  1. 下载keil和proteus遇到的问题——学习笔记
  2. SQL语句 合并列值 将一列的多个值合并成一行
  3. linux配置静态IP(手把手)
  4. 【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )
  5. ZTree的选择性展开树节点
  6. educoder多路选择器与应用4关卡通关2选一、4选一、8选一、MUS应用(在Logisim上演示)
  7. CS231n - Assignment2 Tensorflow
  8. 解析腾讯视频加密播放
  9. 【蓝牙CC2541】调试蓝牙收发功能
  10. SecoClient 警告:当前服务进程已退出或关闭,请尝试重新安装客户端!