1. 程式人生 > >知識儲備:03連結串列:連結串列之啞節點的使用

知識儲備:03連結串列:連結串列之啞節點的使用

要對頭結點進行操作時,考慮建立啞節點dummy,使用dummy->next表示真正的頭節點。這樣可以避免處理頭節點為空的邊界問題。

1.給定一個連結串列和x,對連結串列排序使所有小於x的節點出現在大於或等於x的節點的前面。

程式碼如下:

#include <iostream>

using namespace std;

/*
連結串列之啞節點的使用
2-17-8-22
*/

struct ListNode{
	int value;
	ListNode *next;
	ListNode(int x){ value = x; }
};

//排序:小與x都在大於或等於x的前面
ListNode *reorderXList(ListNode *head, int x)
{
	ListNode *newhead = NULL;
	ListNode *aDummy = new ListNode(0);
	ListNode *aCurr = aDummy;
	ListNode *bDummy = new ListNode(0);
	ListNode *bCurr = bDummy;

	while (head)
	{
		ListNode *next = head->next;
		head->next = NULL;
		if (head->value < x)
		{
			aCurr->next = head;
			aCurr = head;//後移
		}
		else
		{
			bCurr->next = head;
			bCurr = head;
		}
		head = next;
	}

	aCurr->next = bDummy->next;//連線起來
	newhead = aDummy->next;//新的頭節點

	delete aDummy;
	delete bDummy;

	return newhead;
}

int main()
{
	ListNode *a1, *a2, *a3, *a4;
	ListNode *head;
	head = (ListNode*)malloc(sizeof(ListNode));
	a1 = (ListNode*)malloc(sizeof(ListNode));
	a2 = (ListNode*)malloc(sizeof(ListNode));
	a3 = (ListNode*)malloc(sizeof(ListNode));
	a4 = (ListNode*)malloc(sizeof(ListNode));

	head->next = a1;
	a1->value = 5;
	a1->next = a2;
	a2->value = 8;
	a2->next = a3;
	a3->value = 3;
	a3->next = a4;
	a4->value = 6;
	a4->next = NULL;

	ListNode *resHead;
	resHead = reorderXList(head, 6);
	
	return 0;
}