链表
1.可以通过记录最后一个节点来判断是否相交
while(pa->next) { pa = pa-next; } while(pb->next) { pb= pb->next; } if(pa == pb){...}
2.只给定单链表中某个结点p(并非最后一个结点,即p->next!=NULL)指针,删除该结点,无头结点
基本原理,讲当前结点的下个一个结点的数据赋值给当前结点,然后释放下一个结点。
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.判断单链表是否有环
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;
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个位置
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.带头结点的链表转置
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.找出相交链表的交点
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; }
一切源于对计算机的热爱