3、設l為帶頭節點的單鏈表,編寫演算法實現從尾到頭反向輸出每個節點的值。
我想到的是reverse一下/笑哭
想想這個就有點殺雞用牛刀的感覺…
看了題解說是可以用遞迴…臥槽瞬間orz
8、給定兩個單鏈表,找出兩個鍊錶的公共節點。class solution
//利用reverse將整個鍊錶倒置
void reverseoutput(listnode *head)
listnode* reverse(listnode* prev,listnode* begin,listnode *end)
begin->next=end_next;
prev->next=end;
return begin;}};
這道題我想到的辦法是用雜湊,以unordered_map對指標進行儲存,這樣遍歷第乙個鍊錶。
再對第二個鍊錶進行遍歷,並判斷每個指標在裡面是否存在。
如果存在,推入乙個vector裡面
講道理效率應該還不錯o(n+m),如果不允許用額外儲存空間呢?
我們可以確信,二者相遇之後,肯定是相同的節點一直到end,為什麼呢?
因為鍊錶只有唯一的next域
於是我們可以算出兩個鍊錶路程差距是多少,然後讓其中一頭先走這麼多個差距
然後再一起向前走,ok那樣就會同時到達共同節點
複雜度o(m+n)
13、合併兩個遞增的鍊錶,要求合併之後的鍊錶遞減。class solution
else
while(len1)
}return null;
}//使用雜湊
vector
getsamenodes(listnode* head1,listnode* head2)
for(listnode* temp=head2;temp!=null;temp=temp->next)
}return result;}};
這道題很顯然是歸併的思路,然後借鑑了leetcode上 add two number的思路,
使判斷結束條件變為cur1|| cur2.這樣在乙個鍊錶長度大於另乙個的時候,使用輔助變數max來幫助計算。
從而簡化**
16、判斷乙個序列是否是另一串行的子串行class solution
else
}return root.next;}};
用的很樸素的辦法,不過還行
17、判斷迴圈雙鏈表是否對稱class solution
//沒有找到
if(cur2!=
null) continue;
return
true;
}return
false;}};
演算法沒有什麼好說的,有些地方需要關心一下,具體詳見注釋
主要有:1、struct定義
2、堆疊變數和記憶體變數的區別
19、雙鏈表元素刪除x#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;}};
鍊錶的刪除有一點需要注意,如果需要刪除x元素,不需要遍歷兩遍。
只需要在第一遍遍歷的時候使用雙指標,另乙個指標叫做minp,儲存最小節點的前驅節點。
這樣在一輪迴圈之後,可以在o(1)的時間內,利用這個前驅刪除相應的節點
21、找出倒數第k個元素
使用兩個指標,第乙個指標先走k步,然後兩個指標一起走,直到第乙個指標走到末尾。
然後就是在向前走k的時候注意指標判空這些小細節
23、刪除重複節點class solution
};
沒什麼好說的,主要想說一下unordered_map標頭檔案引用
一般應該#include< unordered_map >就行了,但是我的devc不過
於是,應當是
思考題:找出乙個陣列裡大小之和為k的#if(__cplusplus == 201103l)
#include
#include
#else
#include
#include
namespace
std#endif
重新回顧一下快排
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...