王道資料結構課後習題 P018

2021-07-15 23:58:03 字數 1129 閱讀 8790

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];

}//這部分**是有問題的,如果出現在第一位的話就無法解決了

return i+1

;//正確的方法

int k=0

;for(int i=0

;iif(a[i]!=x) a[k++]=a[i];

}//同時,利用找x然後刪除的辦法也是可解的

int k=0

;while(iif(a[i]==x) k++;

//注意這裡,記錄之前遇到的相等的數量k

//遇到不等的時候,向後賦值

else

a[i-k]=a[i];

i++;

}

題目問的是刪除值為x的,我們一般會考慮找x,然後把這些值跳過。

而比較好的辦法是利用雙指標,然後找不是x的,留下&賦值

8.給定陣列a[m+n],要求在不申請額外陣列空間的情況下,反轉前m和後n個數,並且其內部順序不可改變.

顯然,限制了不申請額外空間就有點棘手了。

可以考慮先將整個陣列反轉,再將前n個,後m個分別反轉

void reverse(vector

nums,int left,int right){

if(left>=right || right>nums.size()) return;

int mid=(left+right)/2;

int offset=mid-left;

for(int i=0;i//於是反轉3次即可

reverse(nums,0,m+n+1);

reverse(nums,0,n-1);

reverse(nums,n,m+n-1);

故不要眼高手低地看待任何一題,真正把**寫出來,就會發現自己所寫的還有很多缺陷,都一定有可以改進的地方。

王道資料結構課後習題 P37

3 設l為帶頭節點的單鏈表,編寫演算法實現從尾到頭反向輸出每個節點的值。我想到的是reverse一下 笑哭 想想這個就有點殺雞用牛刀的感覺 看了題解說是可以用遞迴 臥槽瞬間orz class solution 利用reverse將整個鍊錶倒置 void reverseoutput listnode ...

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

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

王道資料結構課後題 P121

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