1.可以通过记录最后一个节点来判断是否相交
| while(pa->next) { ????pa = pa-next; }? while(pb->next) { ????pb= pb->next; } if(pa == pb){...} |
2.只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点,无头结点
基本原理,讲当前结点的下个一个结点的数据赋值给当前结点,然后释放下一个结点。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | typedef?struct?node { ????int?value; ????struct?node *next; } list_node; void?test(list_node* pCur) { ????list_node *pNext = pCur->next; ????if?(pNext) ????{ ????????pCur->next = pNext->next; ????????pCur->value = pNext->value; ????} ????delete?pNext; } |
3.给定一个结点指针,在结点之前插入一个结点,解法同上
先后插一个结点,然后交换当前结点和后面结点的数据。?
4.判断单链表是否有环
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | typedef?struct?node { ????int?value; ????struct?node *next; } list_node; int???is_link_list_cicled(list_node*?? head)????? {????? ????list_node *p = head,?? ????list_node *q = head;????? ????while(p && q)????? ????{????????????????????????? ????????p =? p-> next;????? ????????q =? q-> next;????? ????????if(!q)????? ????????????return?0;????? ????????q = q-> next;??????? ????????if(!q)????? ????????????return?0;? ?????????if(p?? ==?? q)????? ????????????return???1;?? ????} } |
?5.找到环的入口点
公式x = (n-1)y + y -d;

| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | typedef?struct?node { ????int?value; ????struct?node *next; } list_node; int???is_link_list_cicled(list_node*?? head)????? {????? ????list_node *slow = head,?? ????list_node *fast = head;????? ????while(slow && fast)????? ????{????????????????????????? ????????slow =? slow-> next;????? ????????fast =? fast-> next;????? ????????if(!fast)????? ????????????return?0;????? ????????fast = fast-> next;????? ????????if(!fast)????? ????????????return?0;? ?????????if(slow?? ==?? fast)????? ????????????return???break;?? ????} //找到换的入口点 ????while(slow != fast) ????{ ????????slow = slow->next; ????????fast = fast->next; ????} } |
6.找出倒数第k个数
原理:使用两个指针相差k-1,当第一个指针指向最后的时候,第二个指针则指向第K个位置
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | list_node*?? findK(list_node*?? head,int?k)????? {????? ????list_node* pAhead = head->next; ????list_node* pbehind = head->next; ????for?(int?i = 0;i < k ;++i) ????{ ????????pAhead = pAhead->next; ????} ????while(pAhead->next) ????{ ????????pAhead = pAhead->next; ????????pbehind = pbehind->next; ????} ????return?pAhead; } |
7.若结点个数为奇数则返回中间结点
若为偶数则返回中间第一个个结点
| while(p->next && p->next->next) { ??q = q->next; ??p = p->next->next; } return?q; |
?8.带头结点的链表转置
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | list_node*?? findK(list_node*?? head)????? {????? ????list_node* pPrev =NULL; ????list_node* pCur = head->next; ????list_node* pNext = NULL; ????while(pCur) ????{ ????????pNext = pCur; ????????pCur->next = pPrev; ????????pPrev = pCur; ????????pCur = pNext; ????} ????head->next = pPrev; ????return?NULL; } |
9.找出相交链表的交点
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | list_node*?? findK(list_node*?? heada,list_node *headb)????? {? ????list_node *p = heada->next; ????list_node *q = headb->next; ????int?pLen = 0; ????int?qLen = 0; ????int?steps =?abs(pLen -qLen); ????list_node *head = pLen > qLen? p:q; ????while(steps) ????{ ????????head = head->next; ????????steps--; ????} ????pLen>qLen?p = head:q=head; ????while(p!=q) ????{ ????????p = p->next; ????????q = q->next; ????} ????return?NULL; } |