鍊錶演算法面試題 返回鍊錶的中間節點

2021-10-22 16:05:37 字數 1486 閱讀 8151

給定乙個非空鍊錶的頭節點,從該鍊錶的中間節點開始返回。如果中間節點有兩個,則返回第二個中間節點。

1—>2—>3—>4—>5—>null,中間節點為3,所以返回3—>4—>5—>null。

1—>2—>3—>4—>5—>6—>null,中間節點為3、4,根據要求返回第二個中間節點,所以返回4—>5—>6—>null

題目本身比較簡單,可以借助其他有下標的資料結構來完成,也可以通過先遍歷一次求出鍊錶的長度,再遍歷一次求出結果。

借助有下標的資料結構

/**

* 借助陣列

* 因為鍊錶的問題就在與不能通過下標定位到某個節點,所以我們可以借助陣列來完成,arraylist本質就是乙個動態陣列

** @param head

* @return

*/public listnode middlenode

(listnode head)

return nodelist.

get(nodelist.

size()

/2);

}

借助棧實現,同陣列道理一樣

public listnode middlenode

(listnode head)

int size = stack.

size()

;int mid = size /2;

listnode res = null;

//依次從棧中彈出

for(

int i =

0; i < mid; i++

)//如果是節點的長度是偶數,則直接返回,如果是奇數,則要多彈乙個。if(

(size &1)

==0)return stack.

pop();

}

不借助額外空間,兩次遍歷

/**

* o(1)的空間複雜度實現

* 陣列的方式,需要額外的開闢乙個與節點大小一樣的空間,那麼我們也可以採取遍歷兩次的方式,省去額外的空間代價

** @param head

* @return

*/public listnode middlenode

(listnode head)

int index =0;

while

(index <

(size /2)

)return res;

}

快慢指標

/**

* 快慢指標

* 慢指標每次走一步,快指標每次走兩步,因此快指標走完時,慢指標剛好走了一半,即是我們想要的結果

* * @param head

* @return

*/public listnode middlenode

(listnode head)

return slownode;

}

鍊錶的面試題

1 比較順序表和煉表的優缺點,它們分別在什麼場景下使用?1 順序表支援隨機訪問,單鏈表不支援隨機訪問。2 順序表插入 刪除資料效率很低,時間複雜度為o n 除尾插和尾刪 單鏈表插入 刪除效率更高,時間複雜度為o 1 3 順序表的cpu高速緩衝效率更高,單鏈表cpu高速緩衝效率低。2 列印單向鍊錶 v...

鍊錶的面試題

slist.h include include include typedef int datatype typedef struct listnode node,pnode 生成乙個新結點 pnode buyslistnode datatype data 列印鍊錶 void printslist ...

鍊錶的演算法面試題總結

1 單鏈表的建立和遍歷 2 求單鏈表中節點的個數 太簡單,就不寫了 3 查詢單鏈表中的倒數第k個結點 劍指offer,題15 4 查詢單鏈表中的中間結點 5 合併兩個有序的單鏈表,合併之後的鍊錶依然有序 出現頻率高 劍指offer,題17 6 單鏈表的反轉 出現頻率最高 劍指offer,題16 7 ...