實現就地逆置單鏈表
阿新 • • 發佈:2019-02-15
///////////////////////////////////////// // // 就地逆置單鏈表 // ////////////////////////////////////////// /////////////////// #include <stdio.h> #include <stdlib.h> #include <malloc.h> // 定義單鏈表的結點 typedef struct Node { int elem ; struct Node * next ; } Node ; // 定義單鏈表的型別 typedef struct LinkList { Node * head ; } LinkList ; // 初始化單鏈表 void Init( LinkList * L ) { L->head = (Node*)malloc(sizeof(Node)) ; if( !L->head) { printf("申請記憶體失敗!") ; exit(0) ; } L->head->next = NULL ; } // 插入元素 void Insert( LinkList * L , int elem ) { Node * p = L->head ; while( p->next != NULL ) { p = p->next ; } Node * node = (Node*)malloc(sizeof(Node)) ; if( !node ) { printf("申請記憶體失敗!") ; exit(0) ; } node->elem = elem ; node->next = NULL ; p->next = node ; } // 交換兩個結點的值 void Swap( Node * node1 , Node * node2 ) { int tmp = node1->elem ; node1->elem = node2->elem ; node2->elem = tmp ; } // 就地逆置一個單鏈表 void Reverse( LinkList * L ) { int length = 0 ; Node * p = L->head->next ; while( p != NULL ) { p = p->next ; length++ ; } p = L->head ; Node * q = L->head; for( int i = 0 ; i < length / 2 ; i++ ) { p = p->next ; for( int j = 0 ; j < length - i ; j++ ) { q = q->next ; } } Swap( p , q ) ; } // 輸出單鏈表中的元素 void Print( LinkList * L ) { Node * p = L->head->next ; while( p != NULL ) { printf("%d " , p->elem ) ; p = p->next ; } } // 測試 int main() { LinkList L ; Init( &L ) ; Insert( &L , 7 ) ; Insert( &L , 4 ) ; Insert( &L , 8 ) ; Print( &L ) ; printf("\n") ; Reverse( &L ) ; Print( &L ) ; pritnf("\n") ; return 0 ; }