《Cracking the Coding Interview程式設計師面試金典》----連結串列分割

塵封的記憶0發表於2017-04-28
時間限制:3秒 空間限制:32768K 熱度指數:3274
本題知識點: 程式設計基礎 連結串列
 演算法知識視訊講解

題目描述

編寫程式碼,以給定值x為基準將連結串列分割成兩部分,所有小於x的結點排在大於或等於x的結點之前

給定一個連結串列的頭指標 ListNode* pHead,請返回重新排列後的連結串列的頭指標。注意:分割以後保持原來的資料順序不變。


思路:題目描述的是要將小於給定x值的節點與大於x值的節點分割成兩部分,而本身連結串列的順序不能夠改變。最後需要返回小於x值的連結串列+大於x值的連結串列的頭節點。
想法很單純,既然要分割連結串列就自然需要定義兩個新的連結串列,第一步遍歷整個給定的連結串列將每個節點的值與給定的x值作對比,當小於x的時候就把新定義的p1連結串列的下一個節點指向此時的temp節點,而當大於x值得時候自然就將此時的temp節點賦給p2的下一個節點。
在過程中需要儲存兩個新定義連結串列的表頭,也就是要判斷一下p1和p2的頭結點以便最後返回頭節點。下面為最終的程式碼示例:


/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
	ListNode* partition(ListNode* pHead, int x) {
		// write code here
		ListNode* p1 = NULL;
		ListNode* p2 = NULL;
		ListNode* temp = NULL;
		ListNode* p1Head = NULL;
		ListNode* p2Head = NULL;
		while (pHead){
			temp = pHead->next;
			if (pHead->val<x){
				if (p1 == NULL){
					p1 = pHead;
					p1Head = pHead;
				}

				else{
					p1->next = pHead;
					p1 = p1->next;
				}
			}
			else{
				if (p2 == NULL){
					p2 = pHead;
					p2Head = pHead;
				}

				else{
					p2->next = pHead;
					p2 = p2->next;
				}
			}
			pHead = temp;
		}
		if (p2)
			p2->next = NULL;
		if (p1 == NULL)
			p1Head = p2Head;
		else
			p1->next = p2Head;
		return p1Head;
	}
};

不懂的可以加我的QQ群:261035036(IT程式設計師面試寶典

群) 歡迎你到來哦,看了博文給點腳印唄,謝謝啦~~


相關文章