|
<div id="cnblogs_post_body">链表:
1、注意是否有带头结点。
2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。单链表插入、删除操作需要寻找前驱结点。
3、双向链表和单向链表相比,多了一个前驱指针,单向链表在删除结点时候要遍历链表,双向链表在删除不需要遍历。
一、判断两个链表是否相交:(假设两个链表都没有环)
1、判断第一个链表的每个节点是否在第二个链表中 2、把第二个链表连接到第一个后面,判断得到的链表是否有环,有环则相交 3、如果两个链表有一个公共结点,那么该公共结点之后的所有结点都是重合的,那么,它们的最后一个结点必然是重合的。先遍历第一个链表,记住最后一个节点,再遍历第二个链表,得到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交
如何判断一个单链表是有环的? 设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:
<div class="cnblogs_code">bool IsExitsLoop(ListNode *head) { ListNode *slow = head, *fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; if(slow == fast) break; } return !(fast == NULL || fast->next == NULL); } |
|