单链表的操作是面试中经常会遇到的问题,今天总结一下反转的几种方案:

1 ,两两对换
2, 放入数组,倒置数组
3, 递归实现


代码如下:

#include<stdio.h>
#include<malloc.h>
typedef struct Node
{int data;struct Node *pnext;
} Node,*pnode;
pnode CreateNode()
{pnode phead=(pnode)malloc(sizeof(Node));if(phead==NULL){printf("fail to allocate memory");return -1;}phead->pnext=NULL;int n;pnode ph=phead;for(int i=0; i<5; i++){pnode p=(pnode)malloc(sizeof(Node));if(p==NULL){printf("fail to allocate memory");return -1;}p->data=(i+2)*19;phead->pnext=p;p->pnext=NULL;phead=phead->pnext;}return ph;
}
int list(pnode head)
{int count=0;printf("遍历结果:\n");while(head->pnext!=NULL){printf("%d\t",head->pnext->data);head=head->pnext;count++;}printf("链表长度为:%d\n",count);return count;
}
pnode reverse2(pnode head)//两两节点之间不断交换
{if(head == NULL || head->next == NULL)return head;pnode pre = NULL;pnode next = NULL;while(head != NULL){next = head->next;head->next = pre;pre = head;head = next;
}return pre;
}
void reverse1(pnode head,int count)//把链表的节点值放在数组中,倒置数组
{int a[5]= {0};for(int i=0; i<count,head->pnext!=NULL; i++){a[i]=head->pnext->data;head=head->pnext;}for(int j=0,i=count-1; j<count; j++,i--)printf("%d\t",a[i]);
}pnode reverse3(pnode pre,pnode cur,pnode t)//递归实现链表倒置
{cur -> pnext = pre;if(t == NULL)return cur;   //返回无头节点的指针,遍历的时候注意reverse3(cur,t,t->pnext);
}pnode new_reverse3(pnode head){  //新的递归转置if(head == NULL || head->next == NULL)return head;pnode new_node = new_reverse3(head->next);head->next->next = head;head->next = NULL;return new_node;  //返回新链表头指针
}
int main()
{pnode p=CreateNode();pnode p3=CreateNode();int n=list(p);printf("1反转之后:\n");reverse1(p,n);printf("\n");printf("2反转之后:\n");pnode p1=reverse2(p);list(p1);p3 -> pnext = reverse3(NULL,p3 -> pnext,p3->pnext->pnext);printf("3反转之后:\n");list(p3);free(p);free(p1);free(p3);return 0;
}

毫无疑问,递归是解决的最简单方法,四行就能解决倒置问题。
思路参考:http://blog.csdn.net/feliciafay/article/details/6841115

这里注意: head ->next = pre; 以及 pre = head->next,前者把head->next 指向 pre,而后者是把head->next指向的节点赋值给pre。如果原来head->next 指向 pnext节点,前者则是head重新指向pre,与pnext节点断开,后者把pnext值赋值给pre,head与pnext并没有断开。

单链表实现反转的三种方法相关推荐

  1. C语言实现不带头结点的单链表逆置的三种方法

    C语言实现不带头结点的单链表逆置的三种方法 直接循环 头插法 递归法 END! 直接循环 图片解释 ListNode* ReverseList1(ListNode *head) {if(head == ...

  2. 链表的反转的三种方法

    链表反转的三种方法 普通链表反转法 思想:借助三个Node变量进行节点的移动,促成next指向变化,从而使链表反转 递归链表反转法 思想:想像一个反转成功的链表与剩下的头节点的反转,思考如何进行,只要 ...

  3. java字符串abc反转_JAVA字符串反转的三种方法

    方法一:使用StringBuilder import java.util.Scanner; public class StrReversal { public static void main(Str ...

  4. 实现java字符串反转的三种方法

    实现java字符串反转的三种方法 1.问题描述:将字符串String="abcdefg"实现反转变成 "gfedcba":用java语言实现. 2.解决方法: ...

  5. 带有头节点单链表,带有头节点单链表逆置的四种方法

    文章目录 带头结点的单链表 单链表逆置的四种做法 带头结点的单链表 链式存储结构:逻辑上相邻的数据元素,并不要求物理上也相邻: 单链表的代码实现 .h文件 #pragma once typedef i ...

  6. 带头结点单链表逆置的四种方法思路和实现

    方法一:三个指针 定义三个指针pre(前驱指针)初始化成NULL,s初始化成NULL,p指向第一个数据的地址. (1)pre=NULL,s=NULL,p//链表不为空或链表不止一个节点 (2)s=p; ...

  7. JAVA字符串反转的三种方法

    在键盘中输入asd,反转后得到的是:dsa,这就是字符串的反转:这其中的思路就是运用到逆向遍历的想法.先从键盘中录入字符串,然后获取字符串中的每个字符,再进行逆向的遍历,将遍历的字符放在一个新建的空字 ...

  8. 单链表逆置的四种方法

    1. 三个辅助指针变量 p 向前推进           s缓存p             pre缓存s 没有数据节点 或者 只有一个 不需要逆置 void Single_Link_Inver(Lin ...

  9. python list是数组还是链表实现的_python 数据结构 list和链表实现栈的三种方法

    MAX_SIZE = 100 classMyStack1(object):"""模拟栈""" def __init__(self): sel ...

最新文章

  1. 【HTML/XML 11】XML和HTML的混合使用
  2. 如何处理Entity Framework中的DbUpdateConcurrencyException异常
  3. 独家专访 | 红布林(Plum​)庞博:万亿元二手时尚交易蓝海的生存法则
  4. Day20:绑定方法与非绑定办法、多态和多态性
  5. [转] 在 Mac OS X 下编译 Objective-C 运行时
  6. MySQL在远程访问时非常慢的解决skip-name-resolve
  7. java开源论坛 discuz_Discuz开源论坛
  8. python模块的分类有哪些_整理了一份清单,常见Python问题的快速解答包
  9. sha加密算法介绍以及java实现sha加密算法
  10. python机器学习实践和kaggle实践
  11. 厦门大学计算机专业,厦门大学计算机科学系专业介绍
  12. Cordova打包Scratch为APP
  13. MySQL 获取时间函数
  14. 中计播客 | 为防止员工加班,无人机都用上了!
  15. 去哪儿网查不到历史订单_12306网站上超过30天的历史订单去哪儿找纪录?
  16. 开源项目贡献代码流程
  17. 微信域名批量检测的实现原理
  18. 学习笔记-三维超声相关知识
  19. 养殖场猪舍智能巡检机器人方案
  20. 微服务详讲:具体实践方法和基础设施简述

热门文章

  1. putty的基本使用
  2. ubuntu server执行sudo出现no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory...
  3. Tengine(Nginx)动静分离简要配置
  4. [置顶] iOS中让省略号垂直居中
  5. SUN:开源在Web2.0时代
  6. Python 基础起步(一)写在开篇的话,写给同为小白的你
  7. Express+Socket.IO 实现简易聊天室
  8. 路由器LED闪灯泄露数据
  9. python--列表list
  10. ionic cordova 引用百度地图以及利用手机GPS定位