日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

单链表倒数第K个节点的查找和显示

發(fā)布時間:2025/4/16 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单链表倒数第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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。