Leetcode刷題筆記——24,兩兩交換連結串列中的的節點(連結串列專題)關於連結串列的操作
阿新 • • 發佈:2018-11-10
由於最近在學c++,在看c++primer,所以leetcode做的題也不是很多了,這個題是很長時間做的,一直想寫一下部落格
但是一直沒來得及,現在我說一下我做這道題的思路:
首先我用的是左右指標來操作連結串列的,所以必須定義兩個指標即左指標和右指標,因此想定義一個左指標和右指標得
保證你所定義的指標所指向的區域不能為空。
struct ListNode* swapPairs(struct ListNode* head) { if(head==NULL||head->next==NULL) return head; struct ListNode*l=head; struct ListNode*r=head->next;
如上就是此函式對於指標的定義和初始化,
然後就是做第一步的交換以為第一個位置和第二個位置都不為空
因為在leetcode中的頭節點是有資料儲存的,所以所有連結串列傳參都是頭指標(跑題了~)
回到本題,首先做一步交換再進入迴圈,這樣如果是隻有第三個節點沒有第四個節點時,可以很好的控制迴圈的條件。
所以先進行一步交換(這裡的考點就是靈活的運用雙指標對於連結串列的操作)。
l->next=r->next;
r->next=l;
head=r;
注意* 頭指標一定不要忘記連結交換過來的第一個節點因為最後要返回頭指標所以一定不能落下。
接下來就是進入迴圈了,注意左右指標的移動規律就好,下面貼一下全部的程式碼。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* swapPairs(struct ListNode* head) { if(head==NULL||head->next==NULL) return head; struct ListNode*l=head; struct ListNode*r=head->next; l->next=r->next; r->next=l; head=r; struct ListNode*p=l; while(l->next!=NULL && l->next->next!=NULL) { l=l->next; r=l->next; l->next=r->next; r->next=l; p->next=r; p=l; } return head; }