免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1667 | 回复: 5
打印 上一主题 下一主题

[算法] 请教两个算法问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-14 15:34 |只看该作者 |倒序浏览
1: 怎么在O(n)复杂度下,实现对单连表数据元素的旋转?
2:怎么用一个指针实现双向连表?
以上问题来自<<算法导论>>谢谢.

论坛徽章:
0
2 [报告]
发表于 2007-01-14 15:47 |只看该作者
1.“旋转”应该是“逆转”吧?
2.多加一个指针我不知道是不是指在每个链表的节点里面加一个指向前一个元素的指针呢?这样子显然是可以变成双向链表的了

论坛徽章:
0
3 [报告]
发表于 2007-01-14 16:10 |只看该作者
原帖由 okdavinci 于 2007-1-14 15:34 发表
1: 怎么在O(n)复杂度下,实现对单连表数据元素的旋转?
2:怎么用一个指针实现双向连表?
以上问题来自<<算法导论>>谢谢.


第一个用一个栈就行了
第二个没看懂

论坛徽章:
0
4 [报告]
发表于 2007-01-14 16:19 |只看该作者
1: 怎么在O(n)复杂度下,实现对单连表数据元素的旋转?

非常简单 基本上

2:怎么用一个指针实现双向连表?

-_-!  难道是环琏然后要移到前m个就向后移动n-m次

论坛徽章:
0
5 [报告]
发表于 2007-01-14 16:25 |只看该作者
原帖由 okdavinci 于 2007-1-14 15:34 发表
1: 怎么在O(n)复杂度下,实现对单连表数据元素的旋转?
2:怎么用一个指针实现双向连表?
以上问题来自<<算法导论>>谢谢.

估计你没看懂原文
1. 要实现链表逆转,可以设置几个辅助变量就行,比如:
struct Node {
   Data data;
   struct Node* next;
};
struct Node* pHead; //initialize it
struct Node* pHead2 = NULL, pTmp;

while (pHead != NULL) {
   pTmp = pHead;
   pHead = pHead->next;
   pTmp->next = pHead2;
   pHead2 = pTmp;
}
pHead = pHead2;

2. 如果只是一个指针,实现的只能是循环链表,没法双向

论坛徽章:
0
6 [报告]
发表于 2007-01-14 21:23 |只看该作者
第二个问题:


  1. 每个节点保存一个值为 val = pre ^ next
  2. 操作过程中我们总是保存着当前节点的next值

  3. 当前节点地址为addr

  4. 移向后继:
  5. temp <- next
  6. next <- next.val ^ addr
  7. addr <- temp

  8. 移向前驱:
  9. temp <- addr
  10. addr <- addr.val ^ next
  11. next <- temp
复制代码


当然这样做的代价是不能随机根据节点地址取得前驱.
题目的本意应该是减少每个节点链表指针的情况下能支持大部分双向链表的操作

Please correct me if I'm wrong.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP