1、逆置链表
假设链表现在是 4->3->2->1->NULL
逆置后的链表是 1->2->3->4->NULL
步骤:
第一步:先把4用临时指针tmp保存起来,cur指向下一个节点,即cur指向3
第二步:令tmp指向newNode,4是第一个节点,则4的next为NULL,即令tmp->next =newNode(最开始newNode为NULL)
第三步:令 newNode= tmp
以此类推,当cur为NULL时,结束循环。
最后更新头指针,将newNode赋给pHead。
完整代码:
1 void Reverse_list(pLinkList pList) 2 { 3 assert(pList); 4 pLinkNode tmp = NULL; 5 pLinkNode newNode = NULL; //记录链表翻转后的第一个节点 6 pLinkNode cur = pList->phead; 7 while (cur) 8 { 9 tmp = cur; 10 cur = cur->next; 11 tmp->next = newNode; 12 newNode = tmp; 13 } 14 pList->phead = newNode; //更新头结点
2.查找链表中间节点 (只允许遍历一次链表)
快慢指针法:
快指针每次走两步,慢指针每次走一步,等到快指针走到链表尾部时,慢指针刚好走到链表中间
1 pLinkNode FindMidNode(pLinkList pList)//查找链表的中间节点 2 { 3 assert(pList); 4 pLinkNode fast = pList->phead; //快指针,一次走两步 5 pLinkNode slow = pList->phead; //慢指针,一次走一步 6 while(fast!=NULL) 7 { 8 if (fast->next != NULL) 9 { 10 fast = fast->next->next; 11 } 12 else 13 { 14 break; 15 slow = slow->next; 16 } 17 return slow; 18 }
3.删除链表倒数第k个节点,k大0,小于链表长度
首先给个front指针和back指针,最开始都让他们指向头结点,先让front指针移动K次,然后让front指针和back指针同时移动,
一直到front指针指向为NULL,此时back指针指向的就是倒数第K个节点,
然后我们就可以删除back节点
1 oid DelKNode(pLinkList pList, int k) //删除链表倒数第k个节点,k必须小于链表长度,k>0 2 { 3 assert(pList); 4 pLinkNode del= NULL; 5 6 if (k == 1) 7 { 8 PopBack(pList); 9 } 10 pLinkNode front= pList->phead; 11 pLinkNode back = pList->phead; 12 while (front != NULL&&k>0) 13 { 14 front = front->next; 15 k--; 16 } 17 while (front != NULL) 18 { 19 front = front->next; 20 back = back->next; 21 } 22 23 DataType tmp = back->data; 24 back->data = back->next->data; 25 back->next->data = tmp; 26 del = back->next; 27 back->next = back->next->next; 28 free(del); 29 30 31 32 }