右移k位的過程就是按後k位和剩餘位分成兩部分,分別逆序排列,然後把整個陣列逆序排列。
變換過程通過以下步驟完成:
1.逆序排列 abcd: abcd1234 -> dcba1234;
2.逆序排列 1234: dcba1234-> dcba4321;
3.全部逆序 dcba4321->1234abcd。
方法1:將單鏈表儲存為陣列,然後按照陣列的索引逆序進行反轉。
node * reverselist(node *head)
head->next=null; //原先的head已經變成tail,別忘了置空,只有到這步才能置空
*head=p1;
return head;
}
方法3:從第2個節點到第n個節點,依次逐節點插入到第1個節點(head節點)之後,最後將第乙個節點挪到新錶的表尾。
方法1的問題是浪費空間。方法2和方法3效率相當。一般方法2較為常用。
void reverslist(list p)
o(?)
1.快慢指標相遇
從頭指標開始,每次分別移動2、1個節點
2.每個節點設flag
mapnode;
3.窮舉 線性查詢到hashset
每遍歷到乙個新節點,就用新節點和hashset集合當中儲存的節點作比較,如果發現hashset當中存在相同節點id,則說明鍊錶有環,如果hashset當中不存在相同的節點id,就把這個新節點id存入hashset。
時間複雜度:hashset查詢為o(1),使得線性查詢使得o(n*n)變為o(n*1)
空間複雜度:o(1)變為o(n)
快慢指標法 若無環,快指標先為空
fast = fast->next ? fast->next : null; //fast->next == null?
if (null == fast) break;
p1和p2分別都是head指標,先將p2向右移動k次。(此時k為2)
只需要繼續保持p1和p2等間距的右移,當p2的next為null,則證明p1所指的結點的值為倒數第k個節點的值
快慢指標方法
建立兩個指標,乙個指標一次遍歷兩個節點,另乙個節點一次遍歷乙個節點,當快指標遍歷到空節點時,慢指標指向的位置為鍊錶的中間位置。
1.窮舉 hashset兩次遍歷 時間複雜度為:o(max(len1+len2);空間複雜度o(len1)
2.設flag
3.利用有環鏈表思路
對於兩個沒有環的鍊錶相交於一節點,則在這個節點之後的所有結點都是兩個鍊錶所共有的。如果它們相交,則最後乙個結點一定是共有的,則只需要判斷最後乙個結點是否相同即可。時間複雜度為o(len1+len2)。
對於相交的第乙個結點,則可求出兩個鍊錶的長度,然後用長的減去短的得到乙個差值 k,然後讓長的鍊錶先遍歷k個結點。
還可以這樣:其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個
next函式:
(1)next[0]= -1
,任何串的第乙個字元的模式值規定為-1
(2)next[j] = -1
,模式串
t中下標為
j的字元,如果與首字元相同,
前k個字元不等或者相等但t[j] == t[k](匹配夾帶了a[j])。1≤k
t=」aba」 則 next[2]=-1,因k取1,t[2]與首字母相同,但前1個不匹配
t=」abc abc ad」 則 next[6]=-1,因k取3,但t[3]=t[6]
(3)next[j] = k
,模式串
t中下標為
j的字元,如果
前k個字元相等,且t[j] != t[k](匹配不能夾帶a[j])。1≤k
(4)next[j]=0
,除(1)
、(2)
、(3)
的其他情況。
設在字串s中查詢模式串t,若s[m]!=t[n],那麼,取t[n]的模式函式值next[n]
(1) next[n]= -1
表示s[m]
和t[0]
間接比較過了,不相等,下一次比較
s[m+1]
和t[0];
(2) next[n]=0
表示比較過程中產生了不相等,下一次比較
s[m]
和t[0];
(3) next[n]= k >0
但k,表示
s[m]的前k
個字元與
t中的,開始
k個字元已經間接比較相等了,下一次比較
s[m]
和t[k]
相等嗎?
入隊時,直接壓入stack1中
出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素
//入隊操作
void enqueue(stack&s1,stack&s2,int m)
//出隊操作
void dequeue(stack&s1,stack&s2,int &m)
//出棧操作
void stackpop(queue&q1,queue&q2,int &m)
{ int p = q1.size();
for (int i=0;i高度和深度定義
如果結點中有乙個指向父結點的指標,我們可以把問題轉化為求兩個鍊錶的共同結點。
*poj2499
資料結構與演算法 演算法 演算法和資料結構
資料結構與演算法 演算法 好吧,在這裡,您被優秀或優秀的軟體開發人員所隔開。在這種情況下,我會告訴您一開始或至少在我的情況下,並且我知道大多數時候,對於我認識的大多數人,您會覺得自己是乙個無能的人或白痴。基本上,我怎麼可能不理解這一點,然後您會感到沮喪。在這種情況下,我會告訴您情況並不像您想的那麼糟...
資料結構 資料結構與演算法01
1 求一組整數中的最大值。演算法 基本操作是 比較兩個數的大小 模型 仔細想想 你並不知道這個整數到底是多大?整數過大你該怎麼去表示?2 足協的資料庫管理的程式 演算法 需要管理的專案?如何管理?使用者介面?模型 3 資料與資料結構 資料 所有能被輸入到計算機中,並被計算機處理的符號的集合計算機操作...
資料結構 資料結構與演算法02
1 演算法設計的原則 設計演算法時,通常應考慮達到以下目標 1,正確性 2,可讀性 3,健壯性 4,高效率與低儲存量需求 1,正確性 規格說明 四個層次 a,程式中不含語法錯誤 b,程式對於幾組輸入資料能夠得出滿足要求的結果 c,程式對精心選擇的 典型 苛刻切帶有刁難性的幾組輸入資料能夠得出滿足要求...