451 兩兩交換鏈表中的節點
阿新 • • 發佈:2018-06-30
保存 pair PE wrapper rip 進行 其中 mark interview
為操作方便,可以定義一個象征頭結點,則當前等待被掛載節點的前驅節點pre的初始值可以設置為象征頭結點。
遍歷原鏈表,如果當前節點及當前節點的後繼節點都不為NULL時:
1.將當前節點的後繼節點的後繼節點用一個臨時變量保存起來;
2.將當前節點的後繼節點掛載到前驅節點pre上;
3.將當前節點的後繼節點的next值設置為當前節點,即完成相鄰兩個節點交換操作;
4.註意!為防止兩個節點互相掛載形成閉環,需要將尾部的節點也就是交換後的當前節點next值賦為NULL;
5.更新前驅節點,更新後pre應為位於新鏈表尾部的當前節點;
6.用臨時變量更新當前節點;
註意鏈表節點數為奇數的情況,即循環結束後,若當前節點不為NULL,說明原鏈表還剩下一個尾節點需要掛載到新鏈表上。
AC代碼:
原題網址:https://www.lintcode.com/problem/swap-nodes-in-pairs/description
描述
給一個鏈表,兩兩交換其中的節點,然後返回交換後的鏈表。
您在真實的面試中是否遇到過這個題?樣例
給出 1->2->3->4
, 你應該返回的鏈表是 2->1->4->3
。
挑戰
你的算法只能使用常數的額外空間,並且不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
標簽 鏈表 思路:要形成一個新鏈表,主要操作就是掛載節點,應該搞清楚在哪個節點上掛載哪個節點。/**
* Definition of singly-linked-list:
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: a ListNode
* @return: a ListNode
*/
ListNode * swapPairs(ListNode * head) {
// write your code here
if (head==NULL)
{
return head;
}
ListNode *tmp=NULL;
ListNode * newhead=new ListNode(0);
ListNode *pre=newhead;//被掛載的前驅節點;
while(head!=NULL&&head->next!=NULL)
{
tmp=head->next->next;//保存後續節點地址;
//交換;
pre->next=head->next;
head->next->next=head;
head->next=NULL; //防止出現閉環;
pre=head;
head=tmp;
}
if (head!=NULL)//若鏈表節點個數為奇數,將最後一個節點掛載上去;
{
pre->next=head;
}
return newhead->next;
}
};
451 兩兩交換鏈表中的節點