資料結構——連結串列(1)如何找出連結串列中的倒數第k個元素
阿新 • • 發佈:2018-12-30
方法一:①遍歷連結串列,得到連結串列的長度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();
}