1. 程式人生 > >451 兩兩交換鏈表中的節點

451 兩兩交換鏈表中的節點

保存 pair PE wrapper rip 進行 其中 mark interview

原題網址:https://www.lintcode.com/problem/swap-nodes-in-pairs/description

描述

給一個鏈表,兩兩交換其中的節點,然後返回交換後的鏈表。

您在真實的面試中是否遇到過這個題?

樣例

給出 1->2->3->4, 你應該返回的鏈表是 2->1->4->3

挑戰

你的算法只能使用常數的額外空間,並且不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

標簽 鏈表 思路:要形成一個新鏈表,主要操作就是掛載節點,應該搞清楚在哪個節點上掛載哪個節點。
為操作方便,可以定義一個象征頭結點,則當前等待被掛載節點的前驅節點pre的初始值可以設置為象征頭結點。 遍歷原鏈表,如果當前節點及當前節點的後繼節點都不為NULL時: 1.將當前節點的後繼節點的後繼節點用一個臨時變量保存起來; 2.將當前節點的後繼節點掛載到前驅節點pre上; 3.將當前節點的後繼節點的next值設置為當前節點,即完成相鄰兩個節點交換操作; 4.註意!為防止兩個節點互相掛載形成閉環,需要將尾部的節點也就是交換後的當前節點next值賦為NULL; 5.更新前驅節點,更新後pre應為位於新鏈表尾部的當前節點; 6.用臨時變量更新當前節點; 註意鏈表節點數為奇數的情況,即循環結束後,若當前節點不為NULL,說明原鏈表還剩下一個尾節點需要掛載到新鏈表上。
AC代碼:
/**
 * 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 兩兩交換鏈表中的節點