連結串列(無頭)
阿新 • • 發佈:2020-08-28
連結串列
無頭連結串列,定義兩個連結串列的頭和尾
// 連結串列頭尾指標
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 ;
}
}