有时碰到一些刁难程序员的问题,今天就碰到了一个。用递归实现链表逆序,zuii同学提到这个问题,我研究了一下,发现没那么容易写,容易出现死循环。
继续我C语言风格的代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> const int M=10; typedef int Type; typedef struct Node{ Type data; struct Node* next; }Node; void add_elem(Node **head,Type data){ Node* tmp = (Node*)malloc(sizeof(Node)); tmp->data = data; tmp->next = (*head); *head = tmp; } void print_list(Node *head){ while(head){ printf("%d ", head->data); head = head->next; } printf("\n"); }
void reverse_list(Node **head){ if(!*head)//如果(*head)==NULL return; Node *p1,*p2; p1 = *head; p2 = (*head)->next; if(!p2)//如果没有下一个节点
return; reverse_list(&p2);//同时存在两个节点就要进行翻转
p1->next->next = p1; p1->next = NULL;//主要是保证,第一个节点指向NULL
(*head) = p2; } int main(){ Node *head = NULL; for(int i=0;i<M;i++) add_elem(&head, rand()%100); print_list(head); reverse_list(&head); print_list(head); }
|
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(850) | 评论(0) | 转发(0) |