1. 程式人生 > >百度面試題:一個單鏈表,長度未知,如何快速的找出位於中間的那個元素

百度面試題:一個單鏈表,長度未知,如何快速的找出位於中間的那個元素

問題:

一個單鏈表,長度未知,如何快速的找出位於中間的那個元素?

設定兩個指標,p1,p2, 開始p1,p2均位於連結的頭部。
p1 每次步進兩步,
p2 每次步進一步
當p1到達連結串列的末尾時,p2所在的位置就是連結串列的中間元素

時間複雜度為O(n)

詳細情況請見程式碼:

  1. #include <iostream>
  2. usingnamespace std;  
  3. struct node{  
  4.   node *next;  
  5.   int data;   
  6. };  
  7. //用一個類封裝連結串列的操作 
  8. class linknode{  
  9.     public:  
  10.     linknode(){  
  11.     head = new node;  
  12.     head->next = NULL;  
  13.     }  
  14.     ~linknode(){  
  15.       delete head;    
  16.     }  
  17.     //銷燬所有資源 
  18.     void Clear(){  
  19.       node *p,*q;  
  20.       p = head;  
  21.       while(p){  
  22.         q = p->next;  
  23.       delete p;  
  24.       p = q;      
  25.       }  
  26.       //注意這裡 
  27.       head->next = NULL;  
  28.       cout << "OK,destroyed all elements" << endl;  
  29.     }  
  30.     //尾插法 
  31.     void Create(int n){  
  32.         node *p,*q;  
  33.         int data;  
  34.         p = head;  
  35.        while(n--){  
  36.           q = new node;  
  37.           cout << "input data:";  
  38.           cin >> data;  
  39.           q->data = data;  
  40.           q->next = NULL;  
  41.           p->next = q;  
  42.           p = q;  
  43.        }  
  44.     }  
  45.     void Output(){  
  46.        node *p;  
  47.        //注意,不要寫成p = head;因為頭結點沒有儲存資料 
  48.        p = head->next;  
  49.        while(p){  
  50.         cout << p->data << " ";  
  51.          p = p->next;  
  52.        }  
  53.        cout << endl;  
  54.     }  
  55.     //查詢中間的元素 
  56.     node* findMid(){  
  57.         node *p1,*p2;  
  58.         p1 = head;  
  59.         p2 = head;  
  60.         while(p1 != NULL && p2 != NULL){  
  61.           p1 = p1->next->next;  
  62.           p2 = p2->next;   
  63.         }  
  64.         return p2;  
  65.     }  
  66.     private:  
  67.        node *head;  
  68. };  
  69. int main(){  
  70.   linknode lk;  
  71.   node *tmp;  
  72.   lk.Create(5);   
  73.   lk.Output();  
  74.   tmp = lk.findMid();  
  75.   cout << tmp->data << endl;  
  76.   lk.Clear();  
  77. }  

相關推薦

試題:一個單鏈,長度未知,如何快速位於中間那個元素

問題: 一個單鏈表,長度未知,如何快速的找出位於中間的那個元素? 設定兩個指標,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。 題目:如果我們把二叉樹看做圖,父子節點之間的連線看成是雙向的,我們姑且定義“距離”為兩個節點之間邊的個數。寫一個程式求一棵二叉樹中相距最遠的兩個節點之間的距離。 如下圖所