1. 程式人生 > 實用技巧 >連結串列(無頭)

連結串列(無頭)

連結串列

無頭連結串列,定義兩個連結串列的頭和尾

// 連結串列頭尾指標
struct ListNode *g_head_1 = NULL ;
struct ListNode *g_end_1 = NULL ;

struct ListNode *g_head_2 = NULL ;
struct ListNode *g_end_2 = NULL ;

連結串列中常用函式

// 建立一個連結串列 // 頭節點,陣列,元素個數 //尾新增
 ListNode * Creat_list_end (  ListNode * head , int a[] ,int nums  );
 // 建立一個連結串列 // 頭節點,陣列,元素個數 //頭新增
 ListNode * Creat_list_head (  ListNode * head , int a[] ,int nums  );
 // 尾部新增一個數,返回頭指標
 ListNode * Add_num_end (ListNode * head, int daya);
 // 頭部新增一個數,返回頭指標
 ListNode * Add_num_head (ListNode * head, int daya);
 // 合併兩個列表,返回合成列表的 頭 ,op = 0  , 普通合併,其餘合併後排序
ListNode * Add_two_list ( ListNode * head_1 , ListNode* head_2  );
 void swap(int& a, int& b);
// 連結串列排序
ListNode* List_sort( ListNode* head );


// 遍歷連結串列 
void ScanList(ListNode* head );

測試

void test01(   )
{

	Solution s1;
	struct ListNode * head_one = NULL;
	struct ListNode * head_two = NULL;
	struct ListNode * test = NULL;

	//建立一個連結串列
	int a[] = { 1,2,3,4,5 };
	int b[] = { 1, 2,5, 8,9};
	
/*
	ScanList(Creat_list_end(head_one , a , sizeof(a)/sizeof(int)));
	ScanList(Creat_list_end(head_two , b , sizeof(b)/sizeof(int)));*/
	test = Creat_list_end(head_two , a , sizeof(a)/sizeof(int));
	/*test = Add_num_head(test ,5);*/
	test = Add_two_list( Creat_list_end(head_one , a , sizeof(a)/sizeof(int) ), Creat_list_end(head_two , b , sizeof(b)/sizeof(int)         )       );
	// 對 連結串列進行排序
	test = List_sort( test );
	ScanList(  test);


	
	

}

主函式

int main()
{
	cout <<"helo" << endl;
	test01();
	system("pause");
	return 0;


}

函式詳細定義

// 建立一個連結串列 // 頭節點,陣列,元素個數 //尾新增
 ListNode * Creat_list_end (  ListNode * head , int a[] ,int nums  )
{
	struct ListNode * end = NULL;
	

	for (  int i =  0 ; i < nums ; i++   )
	{
		struct ListNode * new_node = (ListNode * )malloc( sizeof (  ListNode  ) );
		new_node ->val = a[i];
		new_node ->next = NULL ;
		if ( head == NULL ) //空連結串列
		{
			head  = new_node; //先連線
			end = new_node ; //後移動尾指標

		}
		else //非空
		{
			end ->next = new_node ; //接到原來尾部
			end = new_node ; // 移動尾指標

		}

	}
	end ->next = NULL ; 

	cout << "連結串列建立完備" << endl;
	return head;
}
 // 建立一個連結串列 // 頭節點,陣列,元素個數 //頭新增
 ListNode * Creat_list_head (  ListNode * head , int a[] ,int nums  )
 {
	 struct ListNode * end = NULL;
	 for (  int i =0; i < nums ; i++ )
	 {
		 struct ListNode * new_node = (ListNode * )malloc(   sizeof(ListNode) );
		 new_node->val = a[i];
		new_node -> next = NULL;
		 if ( head == NULL  )// 空連結串列
		 {
			 head = new_node ;
			 end = new_node ;
		 }
		 else //非空 連結串列
		 {
			 new_node -> next = head ;
			 head = new_node;

		 }


	 }
	 end ->next = NULL ;
	 return head;
 }
 // 尾部新增一個數,返回頭指標
 ListNode * Add_num_end (ListNode * head, int daya)
 {
	 struct ListNode *  Ptemp = head ;
	 while ( Ptemp ->next != NULL  )
	 {
		 Ptemp = Ptemp ->next ; //找到最後一個節點,premp 指向最後一個節點
	 }
	 struct ListNode* node_new = (ListNode*)malloc(sizeof(ListNode));
	 node_new ->val = daya;
	 node_new ->next = NULL ;

	 Ptemp ->next = node_new ;

	 return head;



 }
 // 頭部新增一個數,返回頭指標
 ListNode * Add_num_head (ListNode * head, int daya)
 {
	 struct ListNode *  Ptemp = head ;
	 struct ListNode* node_new = (ListNode*)malloc(sizeof(ListNode));
	 node_new ->val = daya;
	 node_new ->next = NULL ;

	 node_new ->next = head;
	 head = node_new ;

	 return head;
 }
 // 合併兩個列表,返回合成列表的 頭
 ListNode * Add_two_list ( ListNode * head_1 , ListNode* head_2 )
 {
	
		 struct ListNode *  Ptemp = head_1 ;
		 while ( Ptemp ->next != NULL  )
		 {
			 Ptemp = Ptemp ->next ; //找到最後一個節點,premp 指向最後一個節點
		 }
		 Ptemp ->next = head_2 ;
		 return head_1;




 }
 // 連結串列排序
 ListNode* List_sort( ListNode* head )
 {
	 ListNode* Ptemp = head;
	 struct ListNode* p;
	 struct ListNode* q;
	 for(p = head; p != NULL; p = p->next)
	 {
		 for(q = head; q->next != NULL; q = q->next)
		 {
			 if(q->val  >  q->next->val)
			 {
				 swap(q->val  ,   q->next->val);
			 }
		 }

	 }
	 return head;


 }

 void swap(int& a, int& b)
 {
	 int tmp = b;
	 b = a;
	 a = tmp;
 }
// 遍歷連結串列 
void ScanList(ListNode* head )
{
	struct ListNode* ptemp = head ;
	while ( ptemp != NULL )
	{
		cout << "資料為  "<< ptemp ->val  << endl;
		ptemp = ptemp ->next ;
	}
}