1、环状单链表中删除节点

  1. 这是一个环状单链表(整个就是一个环)
  2. 知道一个指向某节点的指针Node *p
  3. 我们想要删除这个节点p
  4. 链表很长,遍历一遍很慢的

关键在于遍历一遍时间开销太大,如何删除当前节点p呢?

虽然要去删除p节点,但我们无法得到p的父节点指针,变通一下:可以通过将p.next数据拷贝到p,再删除p.next来实现

原题:http://fayaa.com/tiku/view/44/

2.、如何判断单向链表有环

定义指针p, q分别按2,1步移动,若最终这两个指针相交则有环。

喜欢这里面的分析:http://blog.csdn.net/huaxm/archive/2007/09/22/1796165.aspx

3、如何判断两个单链表相交

方法一:O(n1+n2) ,分别遍历到链表尾端,判断是否相等。

方法二:将一条链表的尾部接到另一条的头部,将问题转换成判断是否有环。

如何找到连接点呢?

若使用方法一,在可以在第一次遍历时分别记录链表长度。再进行第二次遍历,较长的链表先走n1-n2,然后两个链表指针同时步移,比较第一个相同的节点就是连接点。

若使用方法二,可以证明从链表头和相遇点分别出发的指针第一次相遇的点即为连接点(也即是环的起点)