【链表】反转单链表
来源:互联网 发布:医药行业大数据应用 编辑:程序博客网 时间:2024/05/16 08:09
比如单链表A -> B -> C -> D -> E -> F -> NULL 反转得到 F -> E -> D -> C -> B -> A -> NULL
【算法一】
最通用的算法,对于当前要反转的节点,在反转过程中牵扯到3个节点:前继节点(pPre)、当前节点(pCur)、后继结点(pNext),当然在算法实现的过程中有时候多增加一些变量能带来事半功倍的效果,在这里我们额外定义一个指针变量,用来保存反转后的头节点(pReversedHead),反转的过程实际上就是把当前节点的next指针指向前继节点,后继结点用来保证链表不断裂,所以预设3个指针,步步向前移动,直至NULL,然后返回尾节点的地址。
由于遍历一次可完成反转,时间复杂度为O(n)。
listnode* ReverseLinklist(listnode* pHead){linknode* pReversedHead = NULL;linknode* pb = NULL;//前继节点linknode* pc = pHead;//当前节点linknode* pa = NULL;//后继节点while(pc != NULL){pa = pc->next;//如果当前节点的后继结点为NULL,则说明当前节点即为尾节点if(pa == NULL){pReversedHead = pc;}pc->next = pb;pb = pc;pc = pa;}return pReversedHead;}
【算法二】
递归法。
优点:代码精简。
缺点:不易理解,且如果链表很长容易导致栈溢出。
Node *ReverseList(Node *p,Node *head){ Node *tmp; if(p->next == NULL) { head->next = p; return p; } tmp = ReverseList(p->next,head); tmp->next = p; p->next = NULL; return p;}
- 【链表】反转单链表
- 链表--逆置/反转单链表
- 链表:单链表反转超详解
- 单链表反转
- 单链表反转
- 单链表反转
- 反转单链表
- 单链表反转
- 反转单链表
- 单链表-反转
- 单链表反转
- 单链表反转
- 单链表反转
- 单链表反转
- 单链表反转
- 单链表反转
- 单链表反转
- 单链表反转
- UML类图之咬文嚼字(转载)
- Android APK反编译详解(附图)
- Failed to load properties file for project==>ANDROID_SDK_HOME
- smith chart
- dll的两种调用方式,lib与dll区别
- 【链表】反转单链表
- 如何判断Access DataBase Engine for 2012是否安装
- std string 的常用使用
- vtk获取内存中图像数据
- c#环境变量设置
- undefined reference to `img_convert’的解决方法
- linux & 后台作业
- Python os._exit, sys.exit
- UILabel小结