反转链表经常作为面试题,看过的解答写的都不够清晰易懂。
我是这样认为的:反转链表其实就是把链表从头部依次取出,然后再加入到另一个链表:
#includestruct Node{ int data; struct Node *next; }; struct Node* popFromHead(struct Node **head) { if(*head != 0 ) { struct Node* first = *head; *head = first->next; return first; } else { return 0; } } void pushToHead(struct Node** head, struct Node* t) { t->next = *head; *head = t; } void printList(struct Node *head) { while(head != 0) { printf("%d ", head->data); head = head->next; } printf("n"); } int main() { struct Node *head = 0; struct Node n1, n2, n3; n1.data = 1; n2.data = 2; n3.data = 3; pushToHead(&head, &n3); pushToHead(&head, &n2); pushToHead(&head, &n1); printList(head); struct Node* pNode = 0; struct Node* reverseList = 0; while((pNode = popFromHead(&head)) != 0) { pushToHead(&reverseList, pNode); } printList(reverseList); return 0; } 运行程序输出: 1 2 3 3 2 1 可见链表被反转了



