题目:把一个单链表反转
C语言解题
#include <stdio.h> #include <stdlib.h> typedef struct Node { struct Node *next; int data; }Node,LinkedList; /** *链表的初始化 */ LinkedList* init() { Node* list = NULL; Node* currentNode = list; int i; for(i = 0; i < 5; i ++) { Node * node = (Node*)malloc(sizeof(Node*)); if(node == NULL) { break; } node->data = i; node->next = NULL; if(currentNode != NULL) { currentNode->next = node; currentNode = node; } else { list = node; currentNode = list; } } return list; } /** * 链表的遍历 */ void Traversal(LinkedList *list) { Node *p = list; while(p!= NULL) { printf("%d",p->data); p = p->next; } printf("\n"); } /** * 链表的反转 */ LinkedList* ReversalList(LinkedList *list) { Node *p1,*p2,*p3; p1 = list; p2 = p1->next; p3 = p2->next; p1->next = NULL;//第一个值需要特别处理为NULL while(p2 != NULL)//需要考虑边界值的判定 { p2->next = p1;//最重要的反转处理 //对于这三个指针,需要整体后移,以处理后面的情况 p1 = p2; p2 = p3; if(p3 != NULL)//需要注意边界值的处理 { p3 = p3->next; } } return p1;//经过最后一次的后移,其实p1已经处于最后一个元素 } int main(void) { LinkedList *list = init(); Traversal(list); list = ReversalList(list); Traversal(list); return EXIT_SUCCESS; }