链表的建立及反转
来源:互联网 发布:快速域名网站备案 编辑:程序博客网 时间:2024/06/06 06:42
今天写了下链表,主要是反转,用的递归写,先贴上代码:
链表建立:
struct listNode{ int val; listNode *next;};listNode* build(int arr[], size_t size){ listNode *pHead, *pre; size_t i; for (i = 0; i < size; ++i) { listNode* newNode = (listNode*)malloc(sizeof(listNode)); newNode->val = arr[i]; newNode->next = NULL; if (i == 0) { pHead = newNode; pre = newNode; } else{ pre->next = newNode; pre = pre->next; } } /*while(pHead) { printf("%d ", pHead->val); pHead = pHead->next; } printf("\n");*/ return pHead;}
listNode *nb;void exchange(listNode *a, listNode *b){ int tmp = a->val; a->val = b->val; b->val = tmp;}void list_reverse(listNode *la, listNode *lb, int pos, int mid, bool odd){ if ((pos+1) == mid) { if (odd)//arraySize is odd lb = lb->next->next; else lb = lb->next; exchange(la, lb); nb = lb->next; }// size = 0 ? size = 1 ? 在进入函数前判断 size >= 2 else{ list_reverse(la->next, lb->next, pos+1, mid, odd); exchange(la, nb); nb = nb->next; }}
注解:声明一个全局变量,用在递归里面,这样不需要节点的父指针,利用递归的堆栈保存变量(listNode *la),回溯的时候就能直接使用。
空间复杂度 O(1)
时间复杂度 O(n)
可能的bug: 如果链表节点有100w+,可能会栈溢出。 需要其他方法 !
方法2:
listNode* list_reverse(listNode *pHead){ if (!pHead) return NULL; listNode *pPre = pHead, *pNext = pHead->next, *temp = NULL; pPre->next = NULL; while(pNext) { temp = pNext->next; pNext->next = pPre; pPre = pNext; pNext = temp; } return pPre;}
这种写法不容易出错。在链表链接是不能断,而且必须保证到达最后一个节点。
0 0
- 链表的建立及反转
- 链表的建立、输出、非递归反转、递归反转
- 链表的建立与反转(递归反转和非递归反转)
- 链表创建及反转
- 华为机试题(8)--单向链表的建立,反转(逆序),遍历显示,删除
- 链表的创建、及两链表反转相加!
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 链表的反转
- 星星流浪的城市
- Node.js 博客实例(五)编辑与删除功能
- 《近匠》RealSense:几行代码,为游戏添增实感交互
- 【转】给定一个函数rand5(),使函数rand7()可以随机等概率的生成1-7的整数
- HDU3199 Hamming Problem 【数论】
- 链表的建立及反转
- 随机化一维数组
- PHP foreach中的引用(&)
- frame,bounds的区别
- 韩国PAYWAVE认证之技术篇
- Java实现深度优先搜索和广度优先搜索
- Android系统开发(8)——linx进程基本概念
- 《精通CSS(第2版)》读书笔记2
- C/C++中的extern关键字详解