Leetcode203?
解題思路:此題較為簡單,遍歷鏈表孝治,查找到val陶冷,跳過即可寺酪。
需注意的是霎挟,采用了虛擬頭結(jié)點的方法
程序:
class?Solution?{
public:
????ListNode*?removeElements(ListNode*?head,?int?val)?{
????????ListNode*?dummyHead?=?new?ListNode(0);
????????dummyHead->next?=?head;
????????ListNode*?cur?=?dummyHead;
????????while(cur->next?!=?NULL){
????????????if(cur->next->val?==?val){
????????????????cur->next?=?cur->next->next;
????????????}
????????????else{
????????????????cur?=?cur->next;
????????????}
????????}
????????return?dummyHead->next;
????}
};
Leetcode707
思路:此題考察了對鏈表的全面理解孙咪,較為復(fù)雜
首先票唆,需要自己定義鏈表逊躁,與以往的核心代碼稍有不同,需自己掌握鏈表的定義方法盾舌。
同樣的使用了虛擬頭結(jié)點的方法墓臭,需要注意的是,在涉及到對鏈表的增刪操作時妖谴,需要使cur指向目標(biāo)節(jié)點的前一節(jié)點窿锉,否則會出現(xiàn)錯誤操作,而涉及到讀取節(jié)點值的操作時膝舅,則需要使cur指向目標(biāo)節(jié)點嗡载。
程序:
class?MyLinkedList?{
public:
????struct?LinkNode{
????????int?val;
????????LinkNode*?next;
????????LinkNode(int?val):val(val),?next(nullptr){}
????};
????int?size?=?0;
????LinkNode*?dummyHead?=?new?LinkNode(0);
????MyLinkedList()?{
????}
????int?get(int?index)?{
????????if(index?<?0?||?index?>?(size?-?1))???return?-1;
????????LinkNode*?cur?=?dummyHead->next;
????????while(index--)???cur?=?cur->next;
????????return?cur->val;
????}
????void?addAtHead(int?val)?{
????????LinkNode*?newLink?=?new?LinkNode(val);
????????newLink->next?=?dummyHead->next;
????????dummyHead->next?=?newLink;
????????size++;
????}
????void?addAtTail(int?val)?{
????????LinkNode*?newLink?=?new?LinkNode(val);
????????LinkNode*cur?=?dummyHead;
????????while(cur->next?!=?NULL)????cur?=?cur->next;
????????cur->next?=?newLink;
????????size++;
????}
????void?addAtIndex(int?index,?int?val)?{
????????if(index?<?0?||?index?>?size?)???return;
????????LinkNode*cur?=?dummyHead;
????????LinkNode*?newLink?=?new?LinkNode(val);
????????while(index--)??cur?=?cur->next;
????????LinkNode*?temp?=?cur->next;
????????newLink->next?=?temp;
????????cur->next?=?newLink;
????????size++;
????}
????void?deleteAtIndex(int?index)?{
????????if(index?<?0?||?index?>=?size?)???return;
????????LinkNode*?cur?=?dummyHead;
????????while(index--)??cur?=?cur->next;
????????LinkNode*?tmp?=?cur->next;
????????cur->next?=?cur->next->next;
????????delete?tmp;
????????size--;
????}
};
LeetCode 206
思路:此題可以使用兩種方法解題,但思路大同小異仍稀。
(1)雙指針法
使用兩個不同的指針洼滚,更換兩節(jié)點的指向,并對指針進行更新技潘。知道遍歷完整個鏈表
程序:
class?Solution?{
public:
????ListNode*?reverseList(ListNode*?head)?{
????????ListNode*?temp;
????????ListNode*?cur?=?head;
????????ListNode*?pre?=?NULL;
????????while(cur?!=?NULL){
????????????temp?=?cur->next;
????????????cur->next?=?pre;
????????????pre?=?cur;
????????????cur?=?temp;
????????}
????????return?pre;
????}
};
(2)迭代法
思路同上遥巴,實現(xiàn)的方式有所不同
程序:
classSolution{public:
? ? ListNode*reverse(ListNode* pre,ListNode* cur){
? ? ? ? if(cur == NULL) return pre;
? ? ? ? ListNode* temp= cur->next;
? ? ? ? cur->next = pre;
? ? ? ? return reverse(cur,temp);
? ? }?
? ? ListNode*reverseList(ListNode* head){
? ? ? ? return(reverse(NULL,head));
? ? }
今日總結(jié):
1.在設(shè)計鏈表時注意到了之前已經(jīng)忘記的細節(jié):增刪操作時cur指向目標(biāo)節(jié)點的前一節(jié)點。
2.復(fù)習(xí)了迭代法三部曲享幽,但是感覺迭代法扔掌握的不夠牢铲掐,需要繼續(xù)學(xué)習(xí)。
今日學(xué)習(xí) 2h