百度面試題:一個單鏈表,長度未知,如何快速的找出位於中間的那個元素
問題:
一個單鏈表,長度未知,如何快速的找出位於中間的那個元素?
設定兩個指標,p1,p2, 開始p1,p2均位於連結的頭部。
p1 每次步進兩步,
p2 每次步進一步
當p1到達連結串列的末尾時,p2所在的位置就是連結串列的中間元素
時間複雜度為O(n)
詳細情況請見程式碼:
- #include <iostream>
- usingnamespace std;
- struct node{
- node *next;
- int data;
- };
- //用一個類封裝連結串列的操作
- class linknode{
- public:
-
linknode(){
- head = new node;
- head->next = NULL;
- }
- ~linknode(){
- delete head;
- }
- //銷燬所有資源
- void Clear(){
- node *p,*q;
- p = head;
- while(p){
- q = p->next;
- delete p;
- p = q;
- }
- //注意這裡
-
head->next = NULL;
- cout << "OK,destroyed all elements" << endl;
- }
- //尾插法
- void Create(int n){
- node *p,*q;
- int data;
- p = head;
- while(n--){
- q = new node;
- cout << "input data:";
- cin >> data;
-
q->data = data;
- q->next = NULL;
- p->next = q;
- p = q;
- }
- }
- void Output(){
- node *p;
- //注意,不要寫成p = head;因為頭結點沒有儲存資料
- p = head->next;
- while(p){
- cout << p->data << " ";
- p = p->next;
- }
- cout << endl;
- }
- //查詢中間的元素
- node* findMid(){
- node *p1,*p2;
- p1 = head;
- p2 = head;
- while(p1 != NULL && p2 != NULL){
- p1 = p1->next->next;
- p2 = p2->next;
- }
- return p2;
- }
- private:
- node *head;
- };
- int main(){
- linknode lk;
- node *tmp;
- lk.Create(5);
- lk.Output();
- tmp = lk.findMid();
- cout << tmp->data << endl;
- lk.Clear();
- }
相關推薦
百度面試題:一個單鏈表,長度未知,如何快速的找出位於中間的那個元素
問題: 一個單鏈表,長度未知,如何快速的找出位於中間的那個元素? 設定兩個指標,p1,p2, 開始p1,p2均位於連結的頭部。 p1 每次步進兩步, p2 每次步進一步 當p1到達連結串列的末尾時,p2所在的位置就是連結串列的中間元素 時間複雜度為O(n) 詳
百度面試題 求字串中不含重複字元的最長子串長度
#include<iostream> #include<string> using namespace std; void MaxNoRepeatStrLength(string a) { unsigned int hashtable[128] =
百度面試題(2018.10.29) 內容生態事業部
介紹自己的專案 專案的資料量有多大 zookeeper在follower死掉後,如何重新選舉? hdfs的資料儲存和讀取過程? hdfs在資料儲存過程中,如何保證副本的資料一致性? 當時我沒想起來,於是被問道,如果是你設計,你會如何實現hdf
java經典面試題:單鏈表反轉問題詳解(含遞迴法)
java經典面試題:單鏈表反轉問題,有兩種方法,一種為迴圈遍歷法,一種遞迴法。 1、迴圈遍歷法 首先設定三個節點,把當前節點的下一節點指向它前面的節點,此時你會發現指標鏈會斷,所以要先把它後面一個節點用nextNode儲存下來,之後把節點向後移動遍歷即可。 程式碼如下: //
百度筆試題--論壇資料庫表設計
轉載地址:http://blog.sina.com.cn/s/blog_542a862901000cbq.html 二、 一個簡單的論壇系統,以資料庫儲存如下資料: 使用者名稱,email,主頁,電話,聯絡地址,發帖標題,發帖內容,回覆標題,回覆內容。 每天論壇訪問量300萬
百度面試題:找出陣列中出現次數超過一半的數
現在有一個數組,已知一個數出現的次數超過了一半,請用O(n)的複雜度的演算法找出這個數。 Thinking……/>/> Thinking……/>/>/> Thinking……/>/>/> Thinking……/>/>/> Think
隨機數——百度面試題
題目如下: 已知一隨機發生器,產生0的概率是p,產生1的概率是1-p,現在要你構造一個發生器,使得它構造0和1的概率均為1/2;構造一個發生器,使得它構造1、2、3的概率均為1/3;...,構造一個發生器,使得它構造1、2、3、...n的概率均為1/n,要求複雜度最低。
js百度面試題
小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。 說出以下程式碼執行結果 var a = {n: 1} var b = a; a.x = a
百度面試題 字串中單詞的逆轉,即將單詞出現的順序進行逆轉
#include<stdio.h> #include<string.h> void Rotate(char *start,char *end) { if(start == NULL || end == NULL) return ; while(sta
百度面試題之二叉樹層次遍歷(從上到下,從下到上)
1.二叉樹的層次遍歷 遞迴解法 class Node(object): def __init__(self, v, left=None, right=None): self.value = v self.left = l
陣列中只出現一次的兩個數字(百度面試題)
題目要求: 在一個數組中,其餘數字都是成堆出現的,只有兩個數字出現了一次。儘快找到這兩個數字。 思路: 之前有過類似題,是一組陣列中只有一個數字出現了一次,其餘數字都是成對出現的。找到這個數字。這道題
百度面試題:自己實現strlen,考慮32位,64位機器,考慮效能
沒辦法, 現在的大公司面試就面這個, 你不得不研究下底層的實現.要點:1) 字長邊界對齊以便加快速度. 對齊時也要考慮機器的位數哦. 2) 一次測試4個(或者8個)位元組中是否含零的技巧. 3) 需要自適應32bit/64bit機器. 定義magic變數是要使用lo
【校招】百度面試題-4種陣列去重的方法
第一部分原文連結:http://blog.csdn.net/u011277123/article/details/54091442第二部分原文連結:http://blog.csdn.net/icessunt/article/details/69098474方法一: findI
百度面試題——簡單運算
問題:要求不使用+ - * / < >運算子號判定給定兩個非零數的大小。輸入:多組輸入兩個數a和b。輸出:輸出min=較小的數字,max=較大的數字實現程式碼:#include <stdio.h>int main(int argc,char* argv
[百度面試題]100層樓,球可能會在某一層樓摔壞,問用2個球,最壞情況下幾次測試可以找出該樓層
該題還可以擴充套件,比如說給更多的球,如3個球,多少次測試可以找出樓層。 分析如下: 用動態規劃解這個問題 設f(a, b)為a個球做b次測試可以測試到的樓層數,可以確定的樓層數即為f(a, b) + 1,因為第1層不需測試,需要測試的樓層號僅僅為[2, f(a, b) +
百度面試題之 啟動執行緒方式有哪幾種,執行緒池有哪幾種
1、啟動執行緒方式: 要啟動的可以分為兩類:返回結果和不返回結果。對於這兩種,也分別有兩種啟動執行緒的方式: 1)繼承Thread類,implements Runnable介面 2)實現Callable介面通過FutureTask包裝器來建立Thread執行緒、使用Ex
[百度面試題]100層樓丟玻璃球問題
轉自 : http://blog.csdn.net/prstaxy/article/details/8655988 有一棟100層高的大樓,給你兩個完全相同的玻璃球。假設從某一層開始,丟下玻璃球會摔碎。那麼怎麼利用手中的兩個球,用什麼最優策略知道這個臨界的層是第幾層??
百度面試題--度度熊想去商場買一頂帽子,商場裡有N頂帽子,有些帽子的價格可能相同,度度熊想買一頂價格第三便宜的帽子,問第三便宜的帽子價格是多少?
第一種方法:可以使用LIst 進行每次加入時進行判斷是否包含,將重複的資料不再加入List中 最後再找出List中第三便宜的帽子,若list的size小於3輸出-1; 特點:每次加入資料
一個有頭尾的單鏈表,長度未知,如何快速的找出位於中間的那個元素?
設定兩個指標,p1,p2, 開始p1,p2均位於連結的頭部。p1 每次步進兩步,p2 每次步進一步當p1到達連結串列的末尾時,p2所在的位置就是連結串列的中間元素 這個題目在給一個遞增的連結串列轉換成二分查詢樹時用到了。 發現很多演算法題都會用到雙指標!
二叉樹系列——二叉樹的最大距離(即相距最遠的兩個葉子節點,程式設計之美,百度面試題)
來自於程式設計之美3.8。 題目:如果我們把二叉樹看做圖,父子節點之間的連線看成是雙向的,我們姑且定義“距離”為兩個節點之間邊的個數。寫一個程式求一棵二叉樹中相距最遠的兩個節點之間的距離。 如下圖所