文章目錄
- 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;}
這一節寫完了,宿舍斷電了,去睡覺..