王道資料結構課後習題 P37

2021-07-16 02:27:17 字數 2983 閱讀 6185

3、設l為帶頭節點的單鏈表,編寫演算法實現從尾到頭反向輸出每個節點的值。

我想到的是reverse一下/笑哭

想想這個就有點殺雞用牛刀的感覺…

看了題解說是可以用遞迴…臥槽瞬間orz

class solution

//利用reverse將整個鍊錶倒置

void reverseoutput(listnode *head)

listnode* reverse(listnode* prev,listnode* begin,listnode *end)

begin->next=end_next;

prev->next=end;

return begin;}};

8、給定兩個單鏈表,找出兩個鍊錶的公共節點。

這道題我想到的辦法是用雜湊,以unordered_map對指標進行儲存,這樣遍歷第乙個鍊錶。

再對第二個鍊錶進行遍歷,並判斷每個指標在裡面是否存在。

如果存在,推入乙個vector裡面

講道理效率應該還不錯o(n+m),如果不允許用額外儲存空間呢?

我們可以確信,二者相遇之後,肯定是相同的節點一直到end,為什麼呢?

因為鍊錶只有唯一的next域

於是我們可以算出兩個鍊錶路程差距是多少,然後讓其中一頭先走這麼多個差距

然後再一起向前走,ok那樣就會同時到達共同節點

複雜度o(m+n)

class solution

else

while(len1)

}return null;

}//使用雜湊

vector

getsamenodes(listnode* head1,listnode* head2)

for(listnode* temp=head2;temp!=null;temp=temp->next)

}return result;}};

13、合併兩個遞增的鍊錶,要求合併之後的鍊錶遞減。

這道題很顯然是歸併的思路,然後借鑑了leetcode上 add two number的思路,

使判斷結束條件變為cur1|| cur2.這樣在乙個鍊錶長度大於另乙個的時候,使用輔助變數max來幫助計算。

從而簡化**

class solution

else

}return root.next;}};

16、判斷乙個序列是否是另一串行的子串行

用的很樸素的辦法,不過還行

class solution

//沒有找到

if(cur2!=

null) continue;

return

true;

}return

false;}};

17、判斷迴圈雙鏈表是否對稱

演算法沒有什麼好說的,有些地方需要關心一下,具體詳見注釋

主要有:1、struct定義

2、堆疊變數和記憶體變數的區別

#define _crt_secure_no_warnings

#include

#include

#include

#include

using

namespace

std;

struct listnode 內再進行相關的操作,即初始化與操作分離

listnode(int x) : val(x),prior(null),next(null) {}

};listnode* initnode(vector

arr)

end->next=root;

root->prior=end;

return root;

}void outnode(listnode* root)

printf("\n");

}class solution

}return

true;}};

19、雙鏈表元素刪除x

鍊錶的刪除有一點需要注意,如果需要刪除x元素,不需要遍歷兩遍。

只需要在第一遍遍歷的時候使用雙指標,另乙個指標叫做minp,儲存最小節點的前驅節點。

這樣在一輪迴圈之後,可以在o(1)的時間內,利用這個前驅刪除相應的節點

21、找出倒數第k個元素

使用兩個指標,第乙個指標先走k步,然後兩個指標一起走,直到第乙個指標走到末尾。

然後就是在向前走k的時候注意指標判空這些小細節

class solution

};

23、刪除重複節點

沒什麼好說的,主要想說一下unordered_map標頭檔案引用

一般應該#include< unordered_map >就行了,但是我的devc不過

於是,應當是

#if(__cplusplus == 201103l)

#include

#include

#else

#include

#include

namespace

std#endif

思考題:找出乙個陣列裡大小之和為k的

重新回顧一下快排

int partition(int a,int

left,int

right)

a[left]=x;

return left;

}void qsort(int a,int

left,int

right)

}

王道資料結構課後習題 P018

3.長度為l的順序表,編寫乙個時間複雜度為o n 空間複雜度為o 1 的演算法,該演算法刪除線性表中所有值為x的元素。一看就是典型的雙指標問題,於是我寫 如下 for i 0,j i 1 jif a j x else if a i x a i a j 這部分 是有問題的,如果出現在第一位的話就無法解...

王道資料結構線性表課後習題

1.1.從順序表中刪除具有最小值的元素 假設唯一 並由函式返回被刪除的元素的值,空出的位置由最後乙個元素填補,若順序表為空則顯示出錯資訊並退出執行 bool del min sqlist l,elemtype value l.data pos l.data l.length 1 空出的位置由最後乙個...

王道資料結構課後題 P121

7 判斷乙個二叉樹是否為完全 二叉樹。一開始是想著利用遞迴,判斷有左孩子而無右孩子的節點的個數,並且要求左孩子為葉子節點。判斷的條件很複雜,最後發現這種方法實際上是有問題的。如果同時碰到兩個節點同時為有左葉子節點而右子樹為空,這種情況按照判斷應當返回false 但是這種方法並不能正確返回 1 2 3...