面試題 單鏈表反轉 遞迴和非遞迴

2021-06-09 12:25:13 字數 1209 閱讀 3707

#include #include typedef struct _node

node, *linklist;

//一般反轉

linklist reverse(linklist &head)

node *pre, *cur, *next;

pre = head;

cur = head->next;

while(cur)

head->next = null;

head = pre;

return head;

}//遞迴反轉

//注意最後返回值的next域置null

linklist rreverse(linklist p, linklist &head)

else

}bool createlist(linklist &head, const int *data, const int len)

cur->data = data[0];

cur->next = null;

head = cur;

for(i=1; idata = data[i];

next->next = null;

cur->next = next;

cur = cur->next;

} return true; }

void printlist(linklist head) }

void main( void )

; int len = sizeof(data)/sizeof(int);

linklist head;

if( !createlist(head, data, len) )

printf("反轉前:");

printlist(head);

printf("\n");

reverse(head);

printf("反轉後:");

printlist(head);

printf("\n");

linklist tail = rreverse(head, head);

tail->next = null;

//沒有這條語句,則反轉後的最後兩個節點會形成環

printf("二次反轉後:");

printlist(head);

printf("\n");

}

單鏈表反轉(遞迴和非遞迴)

單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 cpp view plain copy typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟...

單鏈表反轉(遞迴和非遞迴)

單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟2 其中注意,鍊錶是以節點後繼為null...

單鏈表反轉遞迴與非遞迴演算法

1.如下 1 include 2 include 3 4using namespace std 56 struct node 715 16 17 node createlist int elem,int length 1825 return p 26 27 28void destroylist no...