[b]单个链表:[/b]
a.判断是否有环:快慢法(p1=p2=head,p1=p1.next,p2=p2.next.next)
b.环的第一个节点:假设p1,p2在环内的某点p相遇,则p1从p点继续遍历,p2从头节点开始遍历,两者相等的第一个点即为所求(证明略)
c.反向输出链表:利用递归。(printNode(p.next);print(p))
[b]两个链表(均无环):[/b]
a.是否相交:各自遍历至最后一个节点,若最后一个节点相等,则相交
b.相交的第一个点:
solution1 人工构环。将B链表的表尾和A链表的表头相连,转化为求单个有环链表的第一个节点
solution2 在执行a操作时候,记录两个链表的长度len1和len2(假设len1>=len2),则p1先遍历(len1-len2)个结点,然后p2也开始遍历,两者相遇(相等)的第一个节点为所求
[b]两个链表(均有环):[/b]
a.是否相交:将A链表的环断开,若B链表从有环变成无环,则相交
b.相交的第一个点:
solution1 将A链表的环断开,变成两个无环链表求相交的第一个点(相交的第一个点与环入口点可能不是同一个点,求环入口点就按单个有环链表求入口点一样)
solution2 找出各自的环入口,如果相等,则相交
图中包含了链表的几种情况
[img]http://dl.iteye.com/upload/attachment/0062/1282/daf6e0d2-7bbb-39c1-8962-e97b08f3e613.jpg[/img]
可参考以下链接:
[url]http://eriol.iteye.com/blog/1184348[/url]
[url]http://blog.csdn.net/walkinginthewind/article/details/7074022[/url]
a.判断是否有环:快慢法(p1=p2=head,p1=p1.next,p2=p2.next.next)
b.环的第一个节点:假设p1,p2在环内的某点p相遇,则p1从p点继续遍历,p2从头节点开始遍历,两者相等的第一个点即为所求(证明略)
c.反向输出链表:利用递归。(printNode(p.next);print(p))
[b]两个链表(均无环):[/b]
a.是否相交:各自遍历至最后一个节点,若最后一个节点相等,则相交
b.相交的第一个点:
solution1 人工构环。将B链表的表尾和A链表的表头相连,转化为求单个有环链表的第一个节点
solution2 在执行a操作时候,记录两个链表的长度len1和len2(假设len1>=len2),则p1先遍历(len1-len2)个结点,然后p2也开始遍历,两者相遇(相等)的第一个节点为所求
[b]两个链表(均有环):[/b]
a.是否相交:将A链表的环断开,若B链表从有环变成无环,则相交
b.相交的第一个点:
solution1 将A链表的环断开,变成两个无环链表求相交的第一个点(相交的第一个点与环入口点可能不是同一个点,求环入口点就按单个有环链表求入口点一样)
solution2 找出各自的环入口,如果相等,则相交
图中包含了链表的几种情况
[img]http://dl.iteye.com/upload/attachment/0062/1282/daf6e0d2-7bbb-39c1-8962-e97b08f3e613.jpg[/img]
可参考以下链接:
[url]http://eriol.iteye.com/blog/1184348[/url]
[url]http://blog.csdn.net/walkinginthewind/article/details/7074022[/url]