算法题
2016-03-31 21:23
225 查看
单链表逆序
有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示:
图(1)初始状态
初始状态,prev是NULL,head指向当前的头节点A,next指向A节点的下一个节点B。首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的next已经指向B节点了,因此修改A节点的next指针不会导致链表丢失)。逆向节点A之后,链表的状态如图(2)所示:
图(2)经过第一次迭代后的状态
从图(1)的初始状态到图(2)状态共做了四个操作,这四个操作的伪代码如下:
head->next = prev;
prev = head;
head = next;
next = head->next;
这四行伪代码就是循环算法的迭代体了,现在用这个迭代体对图(2)的状态再进行一轮迭代,就得到了图(3)的状态:
图(3)经过第二次迭代后的状态
那么循环终止条件呢?现在对图(3)的状态再迭代一次得到图(4)的状态:
图(4)经过第三次迭代后的状态
此时可以看出,在图(4)的基础上再进行一次迭代就可以完成链表的逆序,因此循环迭代的终止条件就是当前的head指针是NULL。
现在来总结一下,循环的初始条件是:
prev = NULL;
循环迭代体是:
next = head->next;
head->next = prev;
prev = head;
head = next;
循环终止条件是:
head == NULL
根据以上分析结果,逆序单链表的循环算法如下所示:
2、假设有一个数组,大小为100,数组随机存放100个正整数,要求将这100个数按奇偶分开。奇数在前,偶数在后。时间复杂度为O(n),空间复杂度为O(1).
2
有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示:
图(1)初始状态
初始状态,prev是NULL,head指向当前的头节点A,next指向A节点的下一个节点B。首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的next已经指向B节点了,因此修改A节点的next指针不会导致链表丢失)。逆向节点A之后,链表的状态如图(2)所示:
图(2)经过第一次迭代后的状态
从图(1)的初始状态到图(2)状态共做了四个操作,这四个操作的伪代码如下:
head->next = prev;
prev = head;
head = next;
next = head->next;
这四行伪代码就是循环算法的迭代体了,现在用这个迭代体对图(2)的状态再进行一轮迭代,就得到了图(3)的状态:
图(3)经过第二次迭代后的状态
那么循环终止条件呢?现在对图(3)的状态再迭代一次得到图(4)的状态:
图(4)经过第三次迭代后的状态
此时可以看出,在图(4)的基础上再进行一次迭代就可以完成链表的逆序,因此循环迭代的终止条件就是当前的head指针是NULL。
现在来总结一下,循环的初始条件是:
prev = NULL;
循环迭代体是:
next = head->next;
head->next = prev;
prev = head;
head = next;
循环终止条件是:
head == NULL
根据以上分析结果,逆序单链表的循环算法如下所示:
61 LINK_NODE *ReverseLink(LINK_NODE *head) 62 { 63 LINK_NODE *next; 64 LINK_NODE *prev = NULL; 65 66 while(head != NULL) 67 { 68 next = head->next; 69 head->next = prev; 70 prev = head; 71 head = next; 72 } 73 74 return prev; 75 } |
2
相关文章推荐
- NSInteger/NSUInteger与int/unsigned int、long/unsigned long的区别
- textfield键盘遮挡事件(目前标准版)
- JDK源码之AbstractCollection
- codeforces 385 c
- 第五十四篇:BP神经网络博文集
- UVA 473——Raucous Rockers
- zookeeper(三)--- 搭建zookeeper集群
- Problem n
- POJ3009-Curling 2.0
- 面试中65个问题的技巧回答,需要工作的你必须看看
- C++作业2
- POJ1915Knight Moves(单向BFS + 双向BFS)
- Eclipse中Tomcat的Server Locations路径之个人见解
- hdu 2778 LCR 模拟题
- 数独~~~~~~只记得当下的眼疼
- ARM 开发笔记 mini2440 Unexpected core ID. (Found: 0x0032409D/0x00000000, Expected: 0x0032409F)
- Roman to Integer
- 第五十三篇:SVM讲解经典博文集
- 向vsftp服务器上传文件报“550 Permission denied”错误的解决办法 (2012
- C. Tanya and Toys_模拟