我們在做演算法的時候或多或少都會遇到這樣的問題,那就是我們需要獲取某乙個資料集的倒數或者正數第幾個資料。那麼今天我們來看一下這個問題,怎麼去獲取倒數第k個節點。我們拿到這個問題的時候自然而然會想到我們讓鍊錶從末尾開始next k-1 次不就是第k-1個節點了麼,但是必須要注意一點,這是單向鍊錶。那麼這時候的解決思路或許就會出現分歧,大多數人都會想到我們遍歷一下鍊錶,獲取鍊錶的長度,然後再減去 k 長度的節點,那麼我們這個鍊錶的最後乙個節點就是原鍊錶的倒數第k個節點:我們看一下實現**:
/*** 獲取倒數第k個節點的資料
* @param
index
* @return
*/public
int getdtae(int
index)
current =head;
//向後遍歷size-k獲取倒數第k個節點
for(int i = 0;i < size - index;i++)
return
current.date;
}
我們可以發現,這段**可不可以實現我們需要的功能,當然可以。那麼問題來了,如果我們要是輸入的index大於鍊錶的長度或者說鍊錶自身就是乙個空鍊錶,那麼,我們這段**會不會出現問題。或者當我們的index等於0的時候,又會不會出現問題,正常來說我們將倒數都是從倒數第一開始,倒數零是不是就沒有意義,那麼這一段**還夠不夠強壯。這個問題或許我們稍微有一點良好的程式設計思想都會想到,我們留到最後解決。下面我們需要思考的是怎麼在遍歷一邊鍊錶的情況下就獲取到上面的資料。我們可不可以定義兩個節點first和second,他們同時指向head頭結點。我們先把第二個節點向後移動index-1步,這時first和second是不是就相距k,我們再把兩個節點同時向後移動,當second到達鍊錶尾端的時候,是不是就可以說first的位置就是我們需要的倒數第k個節點。**如下:
/*** 獲取倒數第k個節點的資料
* @param
index
* @return
*/public
int getdtae(int
index)
//再把兩個節點同時向後移動,直到second到達尾端位置
while(second!=null
)
return
first.date;
}
我們可以看到這一段**是不是就已經實現了。但是還是那個問題,一段**的強壯型在於它在處理特殊事件時候的能力,別讓整個程式崩潰。接下來我們進行以下操作,避免我們所說的三個問題,index等於0,index超過了鍊錶的長度,鍊錶是空鍊錶/**
* 獲取倒數第k個節點的資料
* @param
index
*@return
*/public
int getdtae(int
index)
//定義兩個節點指向head
node first =head;
node second =head;
//第二個節點向後移動k-1步
for(int i = 0;i < index -1;i++)
}//兩個節點向後移動直到鍊錶的尾端
while(second!=null
) return
first.date; }
通過以上問題我們還可以思考乙個事情,如果我們需要得到中間節點,但是只允許遍歷一次的情況下我們應該怎麼去實現:
publicintgetmiddle()
//定義兩個節點同時指向首節點
node first =head;
node second =head;
//將第二個節點向後移動兩步,第乙個節點向後移動一步,直到second到達尾端
while( second.next != null
)
return
first.date;
}
我們需要注意的是這段**有一點缺陷,那就是我們的鍊錶長度如果是偶數的話,那麼我們獲取到的中間值就是 n/2 + 1的節點,與我們的計算會相差一位,不過這不是重點,重要的是我們需要體會裡面的思想。
if(second==null)
資料結構之單向鍊錶
結構體 指標 更強大的資料結構 分類 1 頭指標式鍊錶 不實用很麻煩 2 頭結點式鍊錶 常用 節點 typedef int data 常用操作 1建立 2摧毀3增加 4刪除5查詢 6修改7逆序 ifndef linklist h define linklist h typedef enum bool...
資料結構 二 單向鍊錶 雙向鍊錶
資料結構 一 資料結構基本概念 基於陣列實現線性表 資料結構 二 單向鍊錶 雙向鍊錶 雙鏈表 一 基本概念 單鏈表由乙個個節點組成 public class mysinglelistnode 二 介面 public inte ce mylist 三 功能實現public class mysingle...
C 資料結構與演算法之單向鍊錶
如果乙個節點將指向另乙個節點的指標作為資料成員,那麼多個這樣的節點可以連線起來,只用乙個變數就能夠訪問整個節點序列。這樣的節點序列就是最常用的鍊錶實現方法。鍊錶是一種由節點組成的資料結構,每個節點都包含某些資訊以及指向鍊錶中另乙個節點的指標。如果序列中的節點只包含指向後繼節點的鏈結,該鍊錶就成為單向...