反转链表经常作为面试题,看过的解答写的都不够清晰易懂。
我是这样认为的:反转链表其实就是把链表中的节点从头部依次取出,然后再其加入到另一个链表,这个过程即完成了链表的反转。
#include <stdio.h>
struct 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
可见链表被反转了