给出无环单链表,请将之逆序,即原链表元素位A->B->C->D->E->F,逆序之后位F->E->D->C->B->A.
链表的数据元素结构:
struct node{
int date;
struct node *next;
};
static struct node *head = NULL;链表的头指针,全局变量
链表节点元素的创建函数:
struc node *create_node(int num)
{
struct node *p = (struct node *)malloc(sizeof(*p));
p->date = num;
p->next = NULL;
return p;
}
链表元素的插入方式为头部插入(即每新增的元素总是在最前面),插入函数:
void insert_node(struct node *p)
{
p->next = head;
head = p;
}
链表元素的删除方式也为头部删除(即每次从最前边删除一个元素),删除函数:
struct node *delete_node(void)
{
struct node *tmp;
tmp = head;
head = head->next;
return tmp;
}
当我们通过create_node(num)和insert_node(p)不断的创建和插入新节点后,一条无环单链表便构建好了.现在要将链表逆序,通过观察链表的增加和删除函数,可以看到它的操作很像栈,即后入先出,这样我们可以把链表的每个元素都取出来,再重新插入一次,最先的元素就到了最后,最后的元素就放到了最前边,这样就实现了逆序.
逆序函数如下;
void reserve_link(void)
{
struct node *p = head; //p指向链表首个元素
head = NULL; //头指针置空
struct node *tmp =NULL;
while(p){
tmp = p;
p = p->next; //这两句,不断取出首个元素,头指针后移,既是删除操作
tmp->next = head;
head = tmp; //这两句,不断从头部插入元素,既是插入操作
}
}
另一种思路;用三个struct node *指针,一个用于取元素,一个用于修改next指向,另一个用于在链表上移动.思路略显复杂,条理分明的同学可以试试.