D3|203.移除鏈表元素、707.設(shè)計(jì)鏈表陈瘦、206反轉(zhuǎn)鏈表

LeetCode 203.移除鏈表元素

題目:給你一個(gè)鏈表的頭節(jié)點(diǎn)?head?和一個(gè)整數(shù)val?幌甘,請(qǐng)你刪除鏈表中所有滿足?Node.val == val?的節(jié)點(diǎn),并返回新的頭節(jié)點(diǎn)?痊项。

代碼:

法一:直接對(duì)原鏈表操作锅风。這種方法要考慮兩種情況:1、頭節(jié)點(diǎn)剛好是要?jiǎng)h除的點(diǎn)鞍泉;2遏弱、非頭節(jié)點(diǎn)是要?jiǎng)h除的點(diǎn)。第一種情況通過(guò)head=head->next實(shí)現(xiàn)頭節(jié)點(diǎn)的移動(dòng)塞弊,第二種情況就是正常的刪除節(jié)點(diǎn)的操作漱逸。有一種特殊情況需要考慮到:例如刪除的元素是1泪姨,但是鏈表里面全是1,這時(shí)候頭節(jié)點(diǎn)應(yīng)該不斷地向后移動(dòng)饰抒,直至為空肮砾,所以第一種情況的代碼中應(yīng)該用while而不是if。此外在寫代碼時(shí)要注意袋坑,我們不能對(duì)空指針進(jìn)行操作仗处,所以在對(duì)進(jìn)入循環(huán)時(shí)要判斷空節(jié)點(diǎn)的情況。

/**

* Definition for singly-linked list.

* struct ListNode {

*? ? int val;

*? ? ListNode *next;

*? ? ListNode() : val(0), next(nullptr) {}

*? ? ListNode(int x) : val(x), next(nullptr) {}

*? ? ListNode(int x, ListNode *next) : val(x), next(next) {}

* };

*/

class Solution {

public:

? ? ListNode* removeElements(ListNode* head, int val) {

? ? while(head!=NULL&&head->val==val)

? ? {

? ? ? ? ListNode* temp=head;

? ? ? ? head=head->next;

? ? ? ? delete temp;

? ? }

? ? ListNode* p=head;

? ? while(p!=NULL&&p->next!=NULL)

? ? {

? ? ? ? if(p->next->val==val)

? ? ? ? {

? ? ? ? ? ? ListNode* temp=p->next;

? ? ? ? ? ? p->next=temp->next;

? ? ? ? ? ? delete temp;

? ? ? ? }

? ? ? ? else{

? ? ? ? ? ? p=p->next;

? ? ? ? }

? ? }

? ? return head;

? ? }

};

法二:構(gòu)造虛擬頭節(jié)點(diǎn)枣宫。這種方法是在頭節(jié)點(diǎn)之前再加上一個(gè)節(jié)點(diǎn)婆誓,把頭節(jié)點(diǎn)變成一個(gè)中間的節(jié)點(diǎn),避免了法一的分類判斷也颤,這樣代碼更加簡(jiǎn)潔洋幻。需要注意的是,最后返回的指針是vhead->next翅娶,因?yàn)樵瓉?lái)的head可能被刪除了文留,而虛擬頭節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)永遠(yuǎn)都是原鏈表的頭節(jié)點(diǎn)。

/**

* Definition for singly-linked list.

* struct ListNode {

*? ? int val;

*? ? ListNode *next;

*? ? ListNode() : val(0), next(nullptr) {}

*? ? ListNode(int x) : val(x), next(nullptr) {}

*? ? ListNode(int x, ListNode *next) : val(x), next(next) {}

* };

*/

class Solution {

public:

? ? ListNode* removeElements(ListNode* head, int val) {

? ? ListNode *vhead=new ListNode(0);

? ? vhead->next=head;

? ? ListNode *p=vhead;

? ? while(p!=NULL&&p->next!=NULL)

? ? {


? ? ? ? if(p->next->val==val)

? ? ? ? {

? ? ? ? ? ? ListNode* temp=p->next;

? ? ? ? ? ? p->next=temp->next;

? ? ? ? ? ? delete temp;

? ? ? ? }else{

? ? ? ? ? ? p=p->next;

? ? ? ? }

? ? }

? ? return vhead->next;

? ? }

};


LeetCode 707.設(shè)計(jì)鏈表

題目:設(shè)計(jì)鏈表的實(shí)現(xiàn)竭沫。您可以選擇使用單鏈表或雙鏈表燥翅。單鏈表中的節(jié)點(diǎn)應(yīng)該具有兩個(gè)屬性:val和next。val是當(dāng)前節(jié)點(diǎn)的值蜕提,next是指向下一個(gè)節(jié)點(diǎn)的指針/引用森书。如果要使用雙向鏈表,則還需要一個(gè)屬性prev以指示鏈表中的上一個(gè)節(jié)點(diǎn)谎势。假設(shè)鏈表中的所有節(jié)點(diǎn)都是 0-index 的拄氯。

在鏈表類中實(shí)現(xiàn)這些功能:get(index):獲取鏈表中第index個(gè)節(jié)點(diǎn)的值。如果索引無(wú)效它浅,則返回-1。addAtHead(val):在鏈表的第一個(gè)元素之前添加一個(gè)值為val的節(jié)點(diǎn)镣煮。插入后姐霍,新節(jié)點(diǎn)將成為鏈表的第一個(gè)節(jié)點(diǎn)。addAtTail(val):將值為val?的節(jié)點(diǎn)追加到鏈表的最后一個(gè)元素典唇。addAtIndex(index,val):在鏈表中的第index個(gè)節(jié)點(diǎn)之前添加值為val的節(jié)點(diǎn)镊折。如果index等于鏈表的長(zhǎng)度,則該節(jié)點(diǎn)將附加到鏈表的末尾介衔。如果?index?大于鏈表長(zhǎng)度恨胚,則不會(huì)插入節(jié)點(diǎn)。如果index小于0炎咖,則在頭部插入節(jié)點(diǎn)赃泡。deleteAtIndex(index):如果索引index?有效寒波,則刪除鏈表中的第index?個(gè)節(jié)點(diǎn)。

代碼:

class MyLinkedList {

public:

struct LinkNode{

? ? ? ? int val;

? ? ? ? LinkNode* next;

? ? ? ? LinkNode(int val):val(val),next(NULL){}

? ? };

? ? MyLinkedList() {

? ? vhead=new LinkNode(0);

? ? size=0;

? ? }


? ? int get(int index) {

? ? ? if (index > (size - 1) || index < 0) {

? ? ? ? ? ? return -1;

? ? ? ? }

? ? ? ? LinkNode* cur =vhead->next;

? ? ? ? while(index--){

? ? ? ? ? ? cur = cur->next;

? ? ? ? }

? ? ? ? ? ? return cur->val;

? ? }

? ? void addAtHead(int val) {

? ? LinkNode* p=new LinkNode(val);

? ? p->next=vhead->next;

? ? vhead->next=p;

? ? size++;

? ? }


? ? void addAtTail(int val) {

? ? LinkNode* last=new LinkNode(val);

? ? LinkNode* p=vhead;

? ? while(p->next!=NULL)

? ? {

? ? ? ? p=p->next;

? ? }

? ? p->next=last;

? ? size++;

? ? }


? ? void addAtIndex(int index, int val) {

? ? ? ? if(index>size) return ;

? ? ? ? if(index<0) index=0;

? ? ? ? LinkNode *newnode=new LinkNode(val);

? ? ? ? LinkNode* p=vhead;

? ? ? ? while(index--)

? ? ? ? {

? ? ? ? ? ? p=p->next;

? ? ? ? }

? ? ? ? newnode->next=p->next;

? ? ? ? p->next=newnode;

? ? ? ? size++;

? ? }


? ? void deleteAtIndex(int index) {


? ? if(index>=size||index<0)

? ? {

? ? ? ? return ;

? ? }

? ? ? ? LinkNode* p=vhead;

? ? ? ? LinkNode* temp=p;

? ? ? ? while(index)

? ? ? ? {

? ? ? ? ? ? p=p->next;

? ? ? ? ? ? index--;

? ? ? ? }

? ? ? ? temp=p->next;

? ? ? ? p->next=temp->next;

? ? ? ? delete temp;

? ? ? ? size--;


? ? }

private:

? ? int size;

? ? LinkNode *vhead;

};

/**

* Your MyLinkedList object will be instantiated and called as such:

* MyLinkedList* obj = new MyLinkedList();

* int param_1 = obj->get(index);

* obj->addAtHead(val);

* obj->addAtTail(val);

* obj->addAtIndex(index,val);

* obj->deleteAtIndex(index);

*/

注意:

1升熊、本題在頭節(jié)點(diǎn)節(jié)點(diǎn)之前加入了虛擬頭節(jié)點(diǎn)vhead俄烁,這樣在鏈表中任意一處的添加或者刪除操作都能夠保持一致性,代碼邏輯也更加簡(jiǎn)介级野。

2页屠、在刪除、添加的時(shí)候蓖柔,因?yàn)閱捂湵頍o(wú)法找到前面節(jié)點(diǎn)的特性辰企,所以每個(gè)要操作的位置是p->next,也就是需要操作的前一個(gè)位置才是p况鸣。同時(shí)牢贸,為了避免出錯(cuò),可以找一個(gè)極端的例子帶入懒闷,比如index=0時(shí)十减,這樣寫循環(huán)條件時(shí)就不容易出錯(cuò)。


LeetCode 206.反轉(zhuǎn)鏈表

題目:給你單鏈表的頭節(jié)點(diǎn)?head愤估,請(qǐng)你反轉(zhuǎn)鏈表帮辟,并返回反轉(zhuǎn)后的鏈表。

代碼:

法一:雙指針?lè)ㄍ嫜妗6x一組指針由驹,開(kāi)始時(shí)cur指向head,pre指向head的前一個(gè)元素昔园,因?yàn)榉崔D(zhuǎn)后原本的head會(huì)指向NULL蔓榄,所以pre最開(kāi)始指向NULL。之后cur->next會(huì)指向pre實(shí)現(xiàn)反轉(zhuǎn)默刚,然后pre甥郑、cur同時(shí)向后移動(dòng)一位,繼續(xù)上述操作荤西。注意:因?yàn)閏ur->next=pre時(shí)原來(lái)cur的下一個(gè)節(jié)點(diǎn)就斷開(kāi)了澜搅,為了保證連續(xù)性,所以在cur指向pre之前邪锌,應(yīng)該用一個(gè)臨時(shí)節(jié)點(diǎn)存著原來(lái)cur的下一個(gè)節(jié)點(diǎn)勉躺。

/**

* Definition for singly-linked list.

* struct ListNode {

*? ? int val;

*? ? ListNode *next;

*? ? ListNode() : val(0), next(nullptr) {}

*? ? ListNode(int x) : val(x), next(nullptr) {}

*? ? ListNode(int x, ListNode *next) : val(x), next(next) {}

* };

*/

class Solution {

public:

? ? ListNode* reverseList(ListNode* head) {

? ? ListNode* cur=head;

? ? ListNode* temp=head;

? ? ListNode* pre=NULL;

? ? while(cur!=NULL)

? ? {

? ? ? ? temp=cur->next;

? ? ? ? cur->next=pre;

? ? ? ? pre=cur;

? ? ? ? cur=temp;? ?

? ? }

? ? return pre;

? ? }

};

法二:遞歸法。這種方法本質(zhì)和雙指針是一樣的觅丰,只不過(guò)將雙指針的while函數(shù)寫成了遞歸的方式饵溅。

/**

* Definition for singly-linked list.

* struct ListNode {

*? ? int val;

*? ? ListNode *next;

*? ? ListNode() : val(0), next(nullptr) {}

*? ? ListNode(int x) : val(x), next(nullptr) {}

*? ? ListNode(int x, ListNode *next) : val(x), next(next) {}

* };

*/

class Solution {

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

? ? }

};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妇萄,隨后出現(xiàn)的幾起案子蜕企,更是在濱河造成了極大的恐慌咬荷,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糖赔,死亡現(xiàn)場(chǎng)離奇詭異萍丐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)放典,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門逝变,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奋构,你說(shuō)我怎么就攤上這事壳影。” “怎么了弥臼?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵宴咧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我径缅,道長(zhǎng)掺栅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任纳猪,我火速辦了婚禮氧卧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氏堤。我一直安慰自己沙绝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布鼠锈。 她就那樣靜靜地躺著闪檬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪购笆。 梳的紋絲不亂的頭發(fā)上粗悯,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音同欠,去河邊找鬼样傍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛行您,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剪廉,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼娃循,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了斗蒋?” 一聲冷哼從身側(cè)響起捌斧,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笛质,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后捞蚂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體妇押,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年姓迅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敲霍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丁存,死狀恐怖肩杈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情解寝,我是刑警寧澤扩然,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站聋伦,受9級(jí)特大地震影響夫偶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜觉增,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一兵拢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抑片,春花似錦卵佛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至植捎,卻和暖如春衙解,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焰枢。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工蚓峦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人济锄。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓暑椰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荐绝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子一汽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容