本人编写的单链表反转函数(原创非抄袭!简单易懂,欢迎拍砖)

本文详细介绍了链表翻转的算法实现,包括编写子函数返回特定索引节点地址、遍历链表获取长度,以及通过循环逐个反转节点指向。关键步骤在于两两节点反转,使用临时变量辅助,确保链表正确翻转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法思路:

链表翻转操作流程:

1、编写一个能返还原链表某个索引结点地址的子函数return_node(形参为头结点和索引号(从1开始))

2、翻转前,先遍历原来结点有多少个结点(不包括头结点),假设为list_length

3、采用for循环,每次循环都将相邻两个结点的地址取出,然后让其指向反转,相邻结点从后往前移动遍历

4、让原来结点的next指针域指向NULL,让原结点的头指针指向原结点的最后一个结点。

 

以上最关键就是第2点,相邻结点两两进行结点反转指向,需要用到临时变量temp1,temp2,而且让i从list_length递减到i=2就行了。

编写子函数是为了方便快速的根据索引快速的查找出结点地址。

直接放代码:

//链表翻转子函数.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//检索链表指定结点,并返回地址
node * return_node(node *head,int index)
{
node *p,*q;
p=head;
int count=0;

if(p->next==NULL)//空结点,返回-1
{
return  (node *)-1;
}
p=p->next;//记得移动到第一个结点
while(p!=NULL)
{
count++;
if(count==index)
{
    //printf("检索的索引为:%d,结点地址为:%x\r\n",count,p);
    return p;
}
p=p->next;

}

//链表翻转&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
int rever_node(node *head)
{
node * temp1,*temp2,*p,*temp;
int count=0;
int i;
//====================先遍历原来链表,看看多少个结点
p=head;
if(p->next==NULL)
{
cout<<"没有任何结点"<<endl;
return -1;
}
p=p->next;
while(p!=NULL)
{
temp=p;
p=p->next;
count++;
}
printf("原链表长度为:%d...开始反转...\r\n",count);
//==============================链表反转
temp=return_node(head,count);//把原来链表最后一个结点存起来
for(i=count;i>1;i--)
{

temp1=return_node(head,i);
temp2=return_node(head,i-1);
temp1->next=temp2;

}
head->next=temp;//让头指针指向原来最后一个结点
temp2->next=NULL;//原来第一个链表的结点指向空

return 0;
}

//测试结果&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

 

 

好的,下面是单链表反转的C语言实现代码: ```c #include<stdio.h> #include<stdlib.h> struct ListNode { int val; struct ListNode *next; }; struct ListNode* reverseList(struct ListNode* head) { struct ListNode* prev = NULL; struct ListNode* curr = head; while (curr != NULL) { struct ListNode* nextTemp = curr->next; curr->next = prev; prev = curr; curr = nextTemp; } return prev; } int main() { struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)); head->val = 1; head->next = (struct ListNode*)malloc(sizeof(struct ListNode)); head->next->val = 2; head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode)); head->next->next->val = 3; head->next->next->next = NULL; struct ListNode* new_head = reverseList(head); while (new_head != NULL) { printf("%d ", new_head->val); new_head = new_head->next; } return 0; } ``` 这段代码中,我们首先定义了一个 `ListNode` 结构体,表示单链表的节点。其中,`val` 表示节点的值,`next` 表示指向下一个节点的指针。接着,我们定义了 `reverseList` 函数,用于反转单链表。在函数中,我们使用了三个指针变量 `prev`、`curr` 和 `nextTemp`,分别表示当前节点的前一个节点、当前节点和当前节点的后一个节点。在循环中,我们不断地将当前节点的 `next` 指针指向前一个节点,然后更新三个指针变量的值,直到当前节点为 `NULL`。最后,我们返回反转后的单链表的头指针 `prev`。在 `main` 函数中,我们构造一个简单单链表,并且调用 `reverseList` 函数进行反转,最后输出反转后的单链表的节点值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值