給定乙個非空鍊錶的頭節點,從該鍊錶的中間節點開始返回。如果中間節點有兩個,則返回第二個中間節點。
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 ...