找出单向链表的中项,如果有2个,输出前面一个

superspring 2009-12-03 02:15:33
比如

a->b->c->d->e 返回 c
a->b->c->d 返回 b

很显而意见的办法是遍历链表,先求出链表长度,然后再找出根据中间项的位置

这样做的复杂度 是 链表长度的1.5倍

有没有更好的办法
...全文
236 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigc2000 2009-12-06
  • 打赏
  • 举报
回复
复杂度都是O(n),至于比较次数倒是采用一个走2步,1个走1步
好于数组
lpwcstr 2009-12-05
  • 打赏
  • 举报
回复
typedef struct tag__LinkNode
{
int value;
struct tag__LinkNode * pNext;

}LINKNODE, * PLINKNODE;

PLINKNODE GetMid(PLINKNODE head)
{
PLINKNODE pRet = head;
int i = 0;
PLINKNODE pTmp = head;
while(pTmp)
{
if( i > 0 && !(i % 2))
pRet = pRet->pNext;
pTmp = pTmp->pNext;
i ++;
}
return pRet;
}
alexhilton 2009-12-03
  • 打赏
  • 举报
回复
用二个指针, 一个一次前进一个节点, 一个一次前进二个节点, 当第二个指针到达尾部时, 第一个指钱刚好达到链表中项。
LeonTown 2009-12-03
  • 打赏
  • 举报
回复
cool
[Quote=引用 4 楼 zhoushunda960 的回复:]
设A、B两个指针指向链表,两个指针同时遍历链表,A指针一次跳一步,B指针一次跳两步。B到尾时,A应该就是中间项吧!
[/Quote]
kolapig 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhoushunda960 的回复:]
设A、B两个指针指向链表,两个指针同时遍历链表,A指针一次跳一步,B指针一次跳两步。B到尾时,A应该就是中间项吧!
[/Quote]

这样做的时间复杂度跟楼组的办法是一样的吧。
zhoushunda960 2009-12-03
  • 打赏
  • 举报
回复
设A、B两个指针指向链表,两个指针同时遍历链表,A指针一次跳一步,B指针一次跳两步。B到尾时,A应该就是中间项吧!
superspring 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 meihuakai 的回复:]
在链表生成的时候就给它的么讴歌结点一个数据域,用来记录该结点在链表中的位置,int i=0;i++自动给该数据域赋值,链表生成好后总的结点个数就是最后一个接点的数据,这样直接找
[/Quote]

是单向链表啊,你就算给了一个数据记录节点在链表中位置,也没有一点用处
meihuakai 2009-12-03
  • 打赏
  • 举报
回复
在链表生成的时候就给它的么讴歌结点一个数据域,用来记录该结点在链表中的位置,int i=0;i++自动给该数据域赋值,链表生成好后总的结点个数就是最后一个接点的数据,这样直接找
donkey301 2009-12-03
  • 打赏
  • 举报
回复
可不可以加个记录链表长度的变量,每加一个节点就更新一次。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧