不产生新的链表,请写一段函数将一个单向链表反转顺序:
struct Node //创建一个结构体,存放值和指向下一个结点的指针
{
{
{
{
{
{
#include <stdio.h>
#include <stdlib.h>struct Node //创建一个结构体,存放值和指向下一个结点的指针
{
int value;};
struct Node *next;
typedef struct Node ListNode;
{
ListNode *head = NULL;
ListNode *pre = NULL;
ListNode *cur = NULL;
head = (ListNode *)malloc(sizeof(ListNode)); //为头结点分配空间,不存放任何数据
head->value = 0;
head->next = NULL;
pre = head; //定义的临时结点指向头结点
int i;
for(i = 1;i <= n;i ++)
{
cur = (ListNode *)malloc(sizeof(ListNode)); //为当前需要创建的结点分配内存空间printf("Please input the %d value:",i );scanf("%d",&cur->value);pre->next = cur; //将当前创建的结点与链表的最后结点相连接pre = cur; //移动临时指针,指向最后一个创建的结点的位置
}
cur->next = NULL; //创建完成后,将最后一个结点的next指针置空
return head; //返回这个链表的表头
}
{
ListNode *p = NULL;
p = head->next; //临时的指针指向头结点的下一个结点,这个结点中存放的才是第一条数据信息
while(p != NULL) //循环读取,结点为空时跳出
{
printf("%d ",p->value );
p = p->next; //没读完一次,就将指针指向下一个结点
}
printf("\n");
}
{
if(p->next == NULL)
{
*head = p; //更改原来的头结点的地址,将最后一个节点的地址赋给头结点
return p; //返回最后一个结点的指针
}
reverse(head,p->next)->next=p; //递归调用,递归到最后一个结点,将最后一个节点作为头结点,它的下一个结点就是最后一个结点递归的上一个结点
p->next = NULL; //递归到原来链表的第一个结点之后,将它的下一个结点置空
return p; //返回这个链表
}
{
ListNode *reverse_head = NULL; //用于存放反转后链表的表头
ListNode *pre = NULL; //指向当前结点的前一个结点的指针
ListNode *cur = head; //指向当前结点的指针
ListNode *pnext = NULL; //指向当前结点的后一个指针
while(cur != NULL) //如果当前结点不为空
{
pnext = cur->next; //pnext存放当前结点的下一个结点的地址
if(pnext == NULL) //如果下一个结点为空,直接将当前结点当做反转链表的表头
reverse_head = cur;
cur->next = pre; //将当前结点与前一个结点反向相连
pre = cur; //pre存放当前结点的地址
cur = pnext; //cur存放下一个结点的地址
}
return reverse_head;
}
{
ListNode *head = NULL;
int number = 0;
printf("Please input the number of the node:");
scanf("%d",&number);
head = CreateList(number);
printf("before:\n");
PrintList(head);
printf("after:\n");
/*递归调用*/
reverse(&head->next,head->next);
//因为在创建链表时,头结点没存放数据,所以实际反转时要从头结点的下一个结点开始反转,否则打印的时候会缺少最后一个结点的值
/*非递归调用*/
head->next = reverse2(head->next);
//传递参数时的思想和递归传递一样,将处理结果返回的指针赋值给head->next,因为head是空结点,不存放数据
PrintList(head);
return 0;
}
本文介绍了一种在不创建新链表的情况下反转单向链表的方法。提供了两种实现方式:递归方法和非递归方法,并附带了完整的C语言代码示例。
841

被折叠的 条评论
为什么被折叠?



