快速找到未知長度的單鏈表的中間結點
問題描述:快速找到未知長度的單鏈表的中間結點
普通方法:首先遍歷一遍單鏈表,以確定單鏈表的長度L,然後再從頭結點出發,迴圈L/2次,找到單鏈表的中間結點。
高效演算法(快慢指標):設定兩個指標,*search,*mid都指向單鏈表的頭結點。其中*search指標的移動速度是*mid指標移動速度的2倍。當*search移動到連結串列末尾時,*mid剛好在中間結點。(標尺的思想)
//快速得到單鏈表的中間結點 Status GetMidNode(LinkList &L,int &e){ LinkList search,mid; search = L; mid= L;//初始時候,search和mid都指向連結串列的頭結點 while(search->next != NULL){ if(search->next->next != NULL){ search = search->next->next; mid = mid->next; } else search = search->next; } e = mid->data; return OK; }
相關推薦
騰訊面試題:快速找到未知長度單鏈表的中間結點
題目:快速找到未知長度單鏈表的中間結點首先分析一下,既然是一個面試題,就一定有普通方法和高階方法,而高階方法無疑會為你大大加分!普通方法很簡單:首先遍歷一遍單鏈表以確定單鏈表的長度L。然後再此從頭結點出發迴圈L/2次找到單鏈表的中間結點。普通方法的演算法複雜度為:O(L+L/
快速找到未知長度單鏈表的中間節點
變量 div ride span 一個 ima list 方法 .com 在討論之前,我們首先首先要明白,什麽是單鏈表? 單鏈表:鏈接方式存儲的線性表 單鏈表的結點結構 ┌──┬──┐ │data│next│ └──┴──┘ data域--存放結點值的數
求未知長度單鏈表中倒數第k個節點
問題如下:單鏈表,不知道長度,如何得到它的倒數第k個節點。 方法是:先從第一個結點S開始,走到k個節點到D,再同時移動S和D,直到D到尾巴D`,那麼此時的S就是倒數第k個節點 class LinkedList { private LinkNode
快速找到未知長度的單鏈表的中間結點
問題描述:快速找到未知長度的單鏈表的中間結點 普通方法:首先遍歷一遍單鏈表,以確定單鏈表的長度L,然後再從頭結點出發,迴圈L/2次,找到單鏈表的中間結點。 高效演算法(快慢指標):設定兩個指標,*search,*mid都指向單鏈表的頭結點。其中*search指標的移動速度是*mid指標移動速度的2倍。當*
騰訊面試題 快慢指標演算法快速找到單鏈表中間值
快速找到未知長度的單鏈表的中間節點 普通方法就是遍歷兩次,第一次遍歷得到連結串列長度,第二次遍歷得到中間值。時間複雜度為1.5n。(這裡需要強調1.5) 快速連結串列方法就是利用兩個指標,慢指標每次移動一個數據,快指標每次移動兩個資料。最外層的迴圈用快指標。當快
遍歷一次單鏈表,找出單鏈表中間的值
1,演算法描述:給定一個單鏈表,但不知該表的大小,現要求只遍歷一次,找出位於單鏈表中間的值。 基本思想:設定兩個指標p,q,初始時,分別指向頭結點,迴圈使p後移兩位,q後移一位,當單鏈表遍歷完畢時,q的位置就是中間位置。注意:當單鏈表長度為偶數時,在最後一次迴
【Java】實現一個演算法,找出一個單鏈表中倒數第K個結點
用迭代法,使用兩個指標P1和P2,分別指向連結串列中相聚K個結點的兩個結點。 P1,p2均指向頭加點,然後將P2向前移動K個結點。之後,以相同的速度移動這兩個指標,那麼p2會在length-K步後到達尾結點,這時p1就剛好在第length-K個結點也就是倒數第K個結點的位置
朱有鵬C語言高階---4.9.4--單鏈表--頭結點(4)
朱有鵬C語言高階---4.9.4--單鏈表--頭結點(4) 連結串列還有另一種用法,就是把頭指標指向的第一個節點作為頭節點使用。頭結點的特點是:第一,它緊跟在頭指標後面。第二,頭結點的資料部分是空的(有時候不是空的,而是儲存整個連結串列的節點數),指標部分指向下一個節點,也就是
資料結構——找兩個單鏈表的交叉點,並將交叉點在連結串列ls1中所處的位置打印出來
1、程式檔案 I、 在交叉點/src目錄下分別建立main.c、Linklist.c檔案 //main.c #include <stdio.h> #include <stdlib.h> //包括rand()、srand()、abs()等函式 #include &
2.3從尾到頭輸出單鏈表每個結點的值
這個可以用棧來實現,遍歷單鏈表,將數值存到棧上,遍歷完之後,再輸出棧中的資料 能用棧解決,就可以聯想到使用遞迴來解決了,每當訪問一個結點,先遞迴輸出他後面的結點,然後再輸出本身,這樣連結串列就反向輸出了。 //從尾到頭輸出結點說的值 #include <iostre
c資料結構線性表之單鏈表(帶頭結點)基本操作
#include<stdio.h> #include<malloc.h> #define MAXSIZE 10 #define ElemType char #define OK 1 #define ERROR 0 typedef struct Nod
6-6 求單鏈表結點的階乘和(15 分) 本題要求實現一個函式,求單鏈表L結點的階乘和。這裡預設所有結點的值非負,且題目保證結果在int範圍內。
int FactorialSum( List L ){ int max=0,sum=0; List p,head; head=L; p=head; while(p!=NULL) { if(max<p->Data) max=p->Dat
百度面試題:一個單鏈表,長度未知,如何快速的找出位於中間的那個元素
問題: 一個單鏈表,長度未知,如何快速的找出位於中間的那個元素? 設定兩個指標,p1,p2, 開始p1,p2均位於連結的頭部。 p1 每次步進兩步, p2 每次步進一步 當p1到達連結串列的末尾時,p2所在的位置就是連結串列的中間元素 時間複雜度為O(n) 詳
一個有頭尾的單鏈表,長度未知,如何快速的找出位於中間的那個元素?
設定兩個指標,p1,p2, 開始p1,p2均位於連結的頭部。p1 每次步進兩步,p2 每次步進一步當p1到達連結串列的末尾時,p2所在的位置就是連結串列的中間元素 這個題目在給一個遞增的連結串列轉換成二分查詢樹時用到了。 發現很多演算法題都會用到雙指標!
設計一個演算法,通過一趟遍歷確定長度為n的單鏈表中值最大的結點。
語言:C++ #include <iostream> using namespace std; typedef int Elemtype; typedef struct LNode { Elemtype data; struct LNode *next; }LNode,*Lin
單鏈表實現查詢中間結點
題目: 使用者輸入x; 隨機生成X個元素,輸出中間元素。 若為奇數則輸出中間,若為偶數輸出中間兩個數的平均值 連結串列實現 具體實現演算法: (1)定義兩個指標,首先將他們指向第一個元素 (2)快慢指標,快指標p1是慢指標p2的2倍速度。相當於p1+2,p2++;
連結串列常用操作 單鏈表反轉 連結串列中環的檢測 兩個有序的連結串列合併 刪除連結串列倒數第 n 個結點 求連結串列的中間結點
#include <stdio.h> #include <stdlib.h> /** * 1) 單鏈表反轉 * 2) 連結串列中環的檢測 * 3) 兩個有序的連結串列合併 * 4) 刪除連結串列倒數第 n 個結點 * 5) 求連結串列的中間
快速定位到單鏈表的中間位置的節點
#include <stdio.h> #include<malloc.h> typedef struct Node {int data;struct Node *Next; }Node,*LinkedList; /* 下面的程式為尾差法建立單鏈表 *
查詢單鏈表的中間結點,要求只能遍歷一次連結串列
pNode FindMiddleNode(pList plist) { /* 快慢指標,快的兩步,慢的一步 */ pNode pFast = plist; pNode pSlow = plist; while (pFast&&pFast->n
leetcode鏈表--6、linked-list-cycle-ii(有環單鏈表環的入口結點)
pre you head lis 頭結點 tex -a init int 題目描述 Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull