[C++面試題]之單鏈表

來源:互聯網
上載者:User
文章目錄
  • 1、編程實現一個單鏈表的建立/測長/列印。
  • 2、編程實現單鏈表刪除節點。
  • 3、編寫程式實現單鏈表的插入。
  • 4、編程實現單鏈表的排序。
  • 5、編寫實現單鏈表的逆置。
  • 6、編程實現刪除單鏈表的頭元素。
  • 7、給出一個單鏈表,不知道節點N的值,怎麼只遍曆一次就可以求出中間節點,寫出演算法。
  • 8、給定一個單向鏈表,設計一個時間最佳化並且空間最佳化的演算法,找出該鏈表的倒數第m個元素。實現您的演算法,注意處理相關的出錯情況。m定義為當m=0時,返回鏈表最後一個元素。

     接下來我會介紹C++面試題中第二個重要的板塊——資料結構,主要包括字串的使用、堆、棧、排序方法等,今天我們先來看單鏈表。

 

1、編程實現一個單鏈表的建立/測長/列印。

       答案:

#include<iostream>using namespace std;//單鏈表結構體typedef struct student{int data;struct student *next;}node;//建立單鏈表node *create(){node *head,*p,*s;int x,cycle=1;head=(node*)malloc(sizeof(node)); //建立前端節點p=head;while(cycle){printf("\nPlease input the data:");scanf("%d",&x);if(x!=0){s=(node*)malloc(sizeof(node));//每次建立一個節點s->data=x;printf("\n%d",s->data);p->next=s;p=s;}else{cycle=0;}}head=head->next;p->next=NULL;printf("\n   yyy   %d",head->data);return (head);}//單鏈表測長int length(node *head){int n=0;node *p;p=head;while(p!=NULL){p=p->next;n++;}return (n);}//單鏈表列印void print(node *head){node *p;int n;n=length(head);printf("\nNow,These %d records are :\n",n);p=head;if(head!=NULL)p=p->next;while(p!=NULL){printf("\n   uuu  %d    ",p->data);p=p->next;}}

 

2、編程實現單鏈表刪除節點。

      解析:如果刪除的是前端節點,如:

 

     則把head指標指向前端節點的下一個節點。同時free p1,如所示:

 

    如果刪除的是中間節點,如所示:

 

    則用p2的next指向p1的next同時,free p1 ,如所示:

 

答案:

//單鏈表刪除節點node *remove(node *head ,int num){node *p1,*p2;p1=head;while(num!=p1->data && p1->next!=NULL)//尋找data為num的節點{p2=p1;p1=p1->next;}if(num==p1->data) //如果存在num節點,則刪除{if(p1==head){head=p1->next;free(p1);}else{p2->next=p1->next;}}else{printf("\n%d could not been found",num);}return (head);}

 

3、編寫程式實現單鏈表的插入。

      解析:單鏈表的插入,如所示:

 

     如果插入在頭結點以前,則p0的next指向p1,前端節點指向p0,如所示:

 

    如果插入中間節點,如所示:

 

    則先讓p2的next指向p0,再讓p0指向p1,如所示:

 

    如果插入尾節點,如所示:

 

    則先讓p1的next指向p0,再讓p0指向空,如所示:

 

   答案:

//單鏈表插入節點node *insert(node *head,int num){node *p0,*p1,*p2;p1=head;p0=(node *)malloc(sizeof(node));p0->data=num;while(p0->data > p1->data && p1->next!=NULL){p2==p1;p1=p1->next;}if(p0->data<=p1->data){if(head==p1){p0->next=p1;head=p0;}else{p2->next=p0;p0->next=p1;}}else{p1->next=p0;p0->next=NULL;}return (head);}

 

4、編程實現單鏈表的排序。

     答案:

//單鏈表排序node *sort(node *head){node *p,*p2,*p3;int n;int temp;n=length(head);if(head==NULL ||head->next==NULL)//如果只有一個或者沒有節點return head;p=head;for(int j=1;j<n;++j){p=head;for(int i=0;i<n-j;++i){if(p->data > p->next->data){temp=p->data;p->data=p->next->data;p->next->data=temp;}p=p->next;}}return (head);}

 

5、編寫實現單鏈表的逆置。

     解析:單鏈表模型如所示:

 

    進行單鏈表逆置,首先要讓p2的next指向p1,如所示:

 

    再由p1指向p2,p2指向p3,如所示:

 

    讓後重複p2的next指向p1,p1指向p2,p2指向p3。

 

   答案:

//單鏈表逆置node *reverse(node *head){node *p1,*p2,*p3;if(head==NULL || head->next==NULL)return head;p1=head;p2=p1->next;while(p2){p3=p2->next;p2->next=p1;p1=p2;p2=p3;}head->next=NULL;head=p1;return head;}

 

6、編程實現刪除單鏈表的頭元素。

    答案:

//刪除單鏈表的頭元素void RemoveHead(node *head){node *p;p=head;head=head->next;free(p);}

 

7、給出一個單鏈表,不知道節點N的值,怎麼只遍曆一次就可以求出中間節點,寫出演算法。

    解析:設立兩個指標,比如*p和*q。p每次移動兩個位置,即p=p->next->next,q每次移動一個位置,即q=q->next。當p達到最後一個節點時,q就是中間節點了。

    答案:

//給出一個單鏈表,不知道節點N的值,怎麼只遍曆一次就可以求出中間節點void searchmid(node *head,node *mid){node *p,*q;p=head;q=head;while(p->next->next!=NULL){p=p->next->next;q=q->next;mid=q;}}

 

8、給定一個單向鏈表,設計一個時間最佳化並且空間最佳化的演算法,找出該鏈表的倒數第m個元素。實現您的演算法,注意處理相關的出錯情況。m定義為當m=0時,返回鏈表最後一個元素。

    解析:這是一個難題,我們需要的是倒數第m個元素,所以如果我們從某個元素開始,遍曆了m個元素之後剛好到達鏈表末尾,那麼這個元素就是要找的元素。也許從鏈表的尾部反向推算回去不是最好的辦法,那麼我們可以從鏈表頭開始計數。

    思路一:我們可以先一次遍曆求出鏈表的總長度n,然後順序變數求出第n-m個元素,那麼這個就是我們要找的元素了。

    思路二:我們用兩個指標,一個當前位置指標p和一個指向第m個元素的指標q,需要確保兩個指標之間相差m個元素,然後以同樣的速度移動它們,如果當q到達鏈表末尾時,那麼p指標就是指向倒數第m個元素了。

    答案:

//思路一node *searchLastElement1(node *head,int m){if(head==NULL)return NULL;node *p=head;int count=0;while(p!=NULL){p=p->next;count++;}if(count<m)return NULL;p=head;for(int i=0;i<count-m;i++){p=p->next;}return p;}//思路二node *searchLastElement2(node *head,int m){if(head==NULL)return NULL;node *p,*q;p=head;for(int i=0;i<m;i++){if(p->next!=NULL){p=p->next;}else{return NULL;}}q=head;while(p->next!=NULL){p=p->next;q->next;}return q;}

 

    這一節寫完了,宿舍斷電了,去睡覺..

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.