這道題的常規做法或者說首先想到直覺的方法M1是先求得鏈表的長度,即元素總個數n,然后問題轉化為求順序第n-m+1個元素。下面給出第2種方法M2:先求得順序第m個元素,用一指針P指向這個元素,用另一指針PR指向鏈表的頭部,現在好了,P和PR同時向右移動,直到P為空,則PR就是要求的倒序第m個元素,如果因m超越界限,則PR為空,表示沒找到,這樣一來,只需一次循環就夠了。C++代碼描述如下
1
template<typename T>
2
struct Node
3
{
4
T data; /**////< 數據
5
Node* next; ///< 指向下一結點的指針
6
} ;
7
8
template<typename T>
9
Node<T>* ReverseFind(Node<T>* head, size_t m)
10
{
11
size_t n = 0;
12
Node<T> *p, *pR = NULL;
13
for (p = head;p;p = p->next)
14
{
15
if (++n == m)
16
{
17
pR = head;
18
continue;
19
}
20
if (pR)
21
{
22
pR = pR->next;
23
}
24
}
25
return pR;
26
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

現在分析這2種方法的時間復雜度,假設鏈表元素個數為N,所求倒序為第M元素,N>=M,則M1方法為0(N)+0(N-M)=0(2N-M),M2方法為O(M)+O(N-M)=0(N),因此M2快于M1。