1. 程式人生 > >資料結構——連結串列(1)如何找出連結串列中的倒數第k個元素

資料結構——連結串列(1)如何找出連結串列中的倒數第k個元素

方法一:①遍歷連結串列,得到連結串列的長度n的值;②將倒數的k的序號轉換到順序排號(n-k+1);③遍歷連結串列,直到找到第(n-k+1)個元素。兩次遍歷,時間複雜度為O(n)。
方法二:從第一個元素開始,遍歷k個元素,判斷呢是否為NULL,若為空,則找到第k個元素。多次遍歷,時間複雜度為O(kn)。
方法三:設定兩個指標,第二個比第一個先往後移動k步(因為包含頭結點)。則這兩個指標之間的距離剛好為k。那麼,當第二個指標指向NULL的時候,第一個指標就剛好指在倒數第k個位置。只需一次遍歷。

#include <stdlib.h>
#include<iostream>
typedef int ElemType; struct Node { ElemType data; struct Node *next; }; typedef struct Node Node; typedef struct Node* Linklist; #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MaxSize 30 //儲存空間初始分配量 typedef int Status; Status InitList1(Linklist *L) { *L= (Linklist)malloc(sizeof(Node)); //
產生頭結點,並且使得L指向該頭結點 if (!(*L)) return ERROR; //令頭結點的指標域為空 (*L)->next = NULL; return OK; } //獲取連結串列的長度 int ListLength1(Linklist L) { Linklist p; p=L->next; int len=0; while(p) { p=p->next; len++; } return
len; } //找出單鏈表中的倒數第k個元素 int findInLinkList1(Linklist L, int k) { Linklist p; p=(L); p=L->next; int len=ListLength1(L); int j=1; while(p && j<(len-k+1) ) { p=p->next; j++; } int num=p->data; return num; } int findInLinkList2(Linklist L,int k) { Linklist p,q; p=L; q=p; while(p!=NULL) { p=q->next; for(int i=1;i<k;i++) { p=p->next; } } int num =p->data; return num; } int findInLinkList3(Linklist L, int k) { Linklist p,q; p=L; q=p; int m=0; for(int i=1;i<=k;i++) { q=q->next; m++; } int j=0; while(q!=NULL) { p=p->next; q=q->next; j++; } int num; num=p->data; return num; } //對連結串列進行頭插法 Status ListInsert1(Linklist *L,int i, ElemType e) { Linklist p,s; p=(*L); int j=1; while(p && j<i) { p=p->next; j++; } if (!p || j>i) return ERROR; s=(Linklist)malloc(sizeof(Node)); s->data=e; s->next =p->next; p->next =s; return OK; } int main() { Linklist L; InitList1(&L); //首先,要初始化一個連結串列 int len1=ListLength1(L); printf("%d\n",len1); for (int i=1;i<=5;i++) { ListInsert1(&L,1,i); } int len2=ListLength1(L); printf("%d\n",len2); Linklist p =L; for(int i=1;i<=len2;i++) { printf("%d\n",p->next->data); p=p->next; } int num1=findInLinkList1(L,2);//方法一 printf("num1=%d\n",num1); int num2=findInLinkList3(L,2);//方法二 printf("num2=%d\n",num2); int num3=findInLinkList3(L,2);//方法三 printf("num3=%d\n",num3); getchar(); }