笔试、面试能经常遇到:
/*
**对给定的单链表进行逆置,函数参数
**为指向单链表第一个节点的指针。
*/
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct NODE{
struct NODE *next;
int value;
}Node;
int listReverse(Node **first)
{
Node *left = *first,*right,*temp;
if(left != NULL)
{
right = left->next;
left->next = NULL;
}
else
return FALSE;
while(right)
{
temp = right->next;
right->next = left;
left = right;
right = temp;
}
*first = left;
return TRUE;
}
/*
**测试用,在主函数里建一个无序链表,然后对其逆置
*/
int createList(Node **nextp,int newValue) //建立一个无序单链表
{
Node *current,*newNode;
newNode = (Node *)malloc(sizeof(Node));
if(newNode == NULL)
return FALSE;
newNode->value = newValue;
while((current = *nextp) != NULL)
nextp = &(current->next);
newNode->next = current;
*nextp = newNode;
return TRUE;
}
int main(void)
{
Node *head,*newNode,*temp;
int newValue,count = 5; //测试用的整数个数
head = NULL;
printf("请输入%d个整数:\n",count);
scanf("%d",&newValue);
head = (Node*)malloc(sizeof(Node));
head->value = newValue;
head->next = NULL;
temp = head;
while(--count)
{
scanf("%d",&newValue);
newNode = (Node*)malloc(sizeof(Node));
newNode->value = newValue;
newNode->next = NULL;
temp->next = newNode;
temp = newNode;
//createList(&head,newValue); //用函数调用的方式
//free(newNode); //切记不要乱用free!
newNode = NULL;
}
temp->next=NULL;
listReverse(&head);
printf("逆置后的链表为:\n");
while(head)
{
printf("%d ",head->value);
head = head->next;
}
printf("\n");
return TRUE;
}