1.描述
給乙個鍊錶,兩兩交換其中的節點,然後返回交換後的鍊錶。
樣例 給出1->2->3->4
, 你應該返回的鍊錶是2->1->4->3
。
2.分析
假設鍊錶中原有的元素為1->2->3->4->5,那麼得到的是2->1->4->3->5,
實質上是把第一第二元素互換,第三第四元素互換,以此類推。如果用乙個
陣列把這些元素存起來,那麼得到的是a[0]、a[1]、a[2]、a[3]、a[4]、a[5],
兩兩交換的到的陣列其中的元素順序為a[1]、a[0]、a[3]、a[2]、a[5]、a[4],
因此建乙個新鍊錶把陣列中的元素按照重新排列的順序從陣列中取出相應的節點利用
尾插法插入到鍊錶中,所得鍊錶就為交換後的鍊錶了。
這裡注意
如果元素個數為奇數
最後乙個元素是不改變的。
3.**
}if(len%2==1)
listnode *r,*s;
r=new listnode(v[i]->val);
s=new listnode(v[i+1]->val);
rear->next=s;
rear=s;
rear->next=r;
rear=r;
listnode *u;
u=new listnode(v[i+2]->val);
rear->next=u;
rear=u;
}return dummy->next;;}
}; 4.總結
用乙個vector把原鍊錶的節點一一讀入,同時得到長度len。之後根據len的奇偶
下面分為兩塊操作。如果為偶數是直接迴圈但如果為奇數最後乙個數要拿出來單獨考慮。
如1、2、3、4兩兩交換為2、1、4、3,這裡a[2]->next=a[3]。
而1、2、3、4、5兩兩交換為2、1、4、3、5,a[2]->next=a[4]。
因此兩種情況迴圈
語句有所不同,故分為奇數和偶數分別考慮。
注意len=1是單獨考慮的,如4->null兩兩交換後的到的還是4->null,本來
這種情況應該應該歸屬在len為奇數中,但在len為奇數的**中紅色**行用到了v[i+1],
而只有乙個元素時是只有乙個v[0]的,因此為防止越界把len=1單獨拿出來考慮,這樣
len=1,len為偶,len為奇就把所有的情況包括了。
LintCode 兩兩交換鍊錶中的節點
題目描述 給乙個鍊錶,兩兩交換其中的節點,然後返回交換後的鍊錶。樣例 給出 1 2 3 4,你應該返回的鍊錶是 2 1 4 3。思路分析 這個題直接 更改每個結點的 val值就行了,沒必要改變 結點的 邏輯順序。我用的乙個陣列儲存下來每個結點的val值就好了 泡泡一直在這裡糾結這個 邏輯順序。搞不懂...
LintCode之兩兩交換鍊錶中的節點
題目描述 我的思路 由題目描述可知,題目是要求將第乙個與第二個節點,第三個與第四節點.進行交換,而進行交換時只用將節點的值進行交換即可。需要注意的是 當鍊表為null或者當鍊表只有乙個節點時就沒有可進行交換的另乙個節點,就可以直接將該鍊錶返回。我的 1 2 definition for singly...
Lintcode 451 兩兩交換鍊錶中的節點
1.問題描述 給乙個鍊錶,兩兩交換其中的節點,然後返回交換後的鍊錶。2.思路 兩兩交換兩個節點資料域所存放的資料元素 3.通過的 4.感想 剛開始的時候自己一直希望通過改指標指向來改變兩個節點的順序,自己的 自己用畫鍊錶圖來驗證也是沒錯,但一直是wrong answer,最後發現應該是在鍊錶的最後的...