請設計時間和空間上都盡可能高效的算法,在不改變連結清單的前提下,求鍊式存儲的線性表的倒數第m(>0)個元素。
函數接口定義:
ElementType Find( List L, int m );
其中List結構定義如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存儲結點資料 */
PtrToNode Next; /* 指向下一個結點的指針 */
};
typedef PtrToNode List; /* 定義單連結清單類型 */
L是給定的帶頭結點的單連結清單;函數Find要将L的倒數第m個元素傳回,并不改變原連結清單。如果這樣的元素不存在,則傳回一個錯誤标志ERROR。
裁判測試程式樣例:
#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 細節在此不表 */
void Print( List L ); /* 細節在此不表 */
ElementType Find( List L, int m );
int main()
{
List L;
int m;
L = Read();
scanf("%d", &m);
printf("%d\n", Find(L,m));
Print(L);
return 0;
}
/* 你的代碼将被嵌在這裡 */
輸入樣例:
5
1 2 4 5 6
3
輸出樣例:
4
1 2 4 5 6
代碼如下
ElementType Find( List L, int m )
{
List t;
int i=0,j=0;
t=L;
while(t->Next!=NULL)
{
t=t->Next;
i++;
}
if(i<m)
return ERROR;
else
{
t=L;
for(j=0;j<i-m+1;j++)
{
t=t->Next;
}
return t->Data;
}
}
注意:
- 因為題目中最後要傳回L,是以要新建立一個指針用來指向結構體中的每個結點
- 思路:先讓指針t從頭結點不斷向後移動用計數器i來記錄連結清單中有多少個結點,然後判斷,如果m>i則說明要傳回的元素不存在。反之存在:讓指針t重新指向頭結點,對于倒數的第m個元素就是整數的第i-m+1個元素,然後用循環讓指針不斷向後☞,最後傳回該元素