您的位置:首页 > 其它

算法题

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

 

根据以上分析结果,逆序单链表的循环算法如下所示:

   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、假设有一个数组,大小为100,数组随机存放100个正整数,要求将这100个数按奇偶分开。奇数在前,偶数在后。时间复杂度为O(n),空间复杂度为O(1).

2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: