程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [CareerCup]Linked Lists—Q2.2

[CareerCup]Linked Lists—Q2.2

編輯:C++入門知識

 

設計算法,從一個單鏈表中找到倒數第n個元素。

 

思路:

由於是單鏈表,我們只能從個前面遍歷。我們可以有以下三種思路:

1、先遍歷整個鏈表,求得鏈表的長度len,而後再從頭遍歷,找到地len-n(假設鏈表的首節點為第一個節點)個節點,即為導數第n個節點,這樣時間復雜度為O(n),需要遍歷的操作len + len-n = 2len-n次。

2、考慮將鏈表從第一個節點開始依次壓棧,這樣出棧的時候,第n個出棧的元素即為鏈表中的第n個節點,這樣的時間復雜度依然為O(n),需要遍歷的操作為len+n,需要額外的輔助空間,空間復雜度為O(n)。

3、可以設置兩個指針p1和p2,開始時均指向頭結點,而後將指針p2移動n個位置,這樣兩個指針就相差n個節點的距離,而後同時移動兩個指針,當p2移動到鏈尾時,p1便指向了倒數第n個節點。這樣的時間復雜度與需要遍歷的操作次數均和第1種情況相同。

下面的程序中我們采用第三中實現方法。

實現代碼:

 

/*
找到單鏈表中倒數第n個元素
*/
PNODE FindNthToLast(PNODE pHead,int n)
{ 
	if(!pHead || n<1)
		return NULL;
	PNODE p1 = pHead;
	PNODE p2 = pHead;
	while(p2 && n>0)
	{
		p2 = p2->pNext;
		n--;
	}
	if(n>0)
		return NULL;
	while(p2)
	{
		p1 = p1->pNext;
		p2 = p2->pNext;
	}
	return p1;
}
單鏈表的實現代碼與Q2.1中相同,用的以前寫的單鏈表的代碼,這裡不再貼出。

 

測試結果:

/

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved