单链表倒数第K个节点的查找和显示
生活随笔
收集整理的這篇文章主要介紹了
单链表倒数第K个节点的查找和显示
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
單鏈表倒數(shù)第K個節(jié)點的查找和顯示
最近在學回顧之前學到的知識,正好碰到了關(guān)于鏈表查找的一道面試題,在此貼出來,與小伙伴們共同交流~
在剛看到題目,其實很容易就想到一個方法,就是先求鏈表的長度(length),然后去超找第length-k+1個節(jié)點的值,再進行查找,先貼代碼如下。
#include <stdio.h> #include <malloc.h> /*鏈表節(jié)點結(jié)構(gòu)*/ typedef struct node{int data;struct node * pNext; }NODE,*PNODE; /*函數(shù)聲明*/ PNODE create_list(); void show_list(PNODE p); void show_list_list(PNODE p); int serch_k(PNODE p,int k); /*主函數(shù)*/ int main(){int k;int len;PNODE pHead=NULL;pHead=create_list();show_list(pHead);len=show_list_length(pHead);printf("\n%d",len);k=serch_k(pHead,2);//查找倒數(shù)第K個值printf("\n%d",k);return 0; } /*生產(chǎn)鏈表*/ PNODE create_list(void){int len;int val;int i;scanf("%d\n",&len);PNODE pHead=(PNODE)malloc(sizeof(NODE));if(pHead==NULL){printf("error");}PNODE pTail=pHead;pTail->pNext=NULL;for(i=0;i<len;i++){scanf("%d",&val);PNODE pNew=(PNODE)malloc(sizeof(NODE));if(pNew==NULL){printf("error");}pNew->data=val;pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew;}return pHead; } /*顯示鏈表*/ void show_list(PNODE p){PNODE p1=p->pNext;if(p1==NULL){printf("error");}while(p1){printf("%d",p1->data);p1=p1->pNext;} } /*顯示鏈表長度*/ int show_list_length(PNODE p){int count=0;PNODE p1=p->pNext;if(p1==NULL){printf("error");}while(p1){count++;p1=p1->pNext;}return count; } /*查找第k個節(jié)點的值*/ int serch_k(PNODE p,int k){ int i=0;PNODE p1=p; int len=show_list_length(p);if(k>len){printf("error");}/*循環(huán)len-k+1次*/for(i=0;i<len-k+1;i++){p1=p1->pNext;}return p1->data; }? ? 這個算法需要對鏈表進行兩次遍歷,導致時間復雜度為O(N^2),那有沒有只需要一次遍歷的呢,答案是有的。
? ? 首先先看下思路:p1和p2分別都是head指針,先將p2向右移動k次,如圖2所示
圖1
? ??
圖2
? ? ?這時候,只需要繼續(xù)保持p1和p2等間距的右移,當p2的next為null,則證明p1所指的結(jié)點的值為倒數(shù)第k個節(jié)點的值
? ? ?
圖3
? ? ?這就是一次遍歷找出倒數(shù)第k個節(jié)點的值,其時間復雜度為O(N)
? ? ?具體代碼如下所示
int serch_k(PNODE p,int k){int i;PNODE p1 = p;PNODE p2 = p;for (i = 0; i < k; i++) {p2 = p2->pNext;}while (p2 != NULL) {p1 = p1->pNext;p2 = p2->pNext;}return p1->data; }? ?這是測試結(jié)果
圖4
? ?這就是單鏈表找倒數(shù)第k個結(jié)點的值的兩種方法。
總結(jié)
以上是生活随笔為你收集整理的单链表倒数第K个节点的查找和显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法详解
- 下一篇: 双向最大匹配算法(含完整代码实现,ui界