MS 笔试题 ,如何判别一个单链表是否含有回路

AntonlioX 2005-10-13 08:57:27
rt

...全文
743 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
aidingding79 2005-10-13
  • 打赏
  • 举报
回复
顶一下 林的算0法不错 很简洁
sjchao 2005-10-13
  • 打赏
  • 举报
回复
回复人: jsjjms(找回真我!!!) ( ) 信誉:100
每个结点设置一个标志位,每次到该结点就将标志位置0xff,那么如果遍历到某个结点已经
是0xff了,那么表示该链表有回路.
这个方法实现起来比较简单,但需要付出空间代价。
也可以直接比较 node_current->next 节点的index值是否小于node_current 节点的index值(如果有index属性 )
AntonlioX 2005-10-13
  • 打赏
  • 举报
回复
谢谢 Cnwanglin(林) ( ) 信誉:100
AntonlioX 2005-10-13
  • 打赏
  • 举报
回复
两个指针从头开始遍历, 一个每次前进 1 , 一个进 2 , 如果每次进1的指针追上了进2 的则有环路, 否则木有哦.
=========
代码可有阿?
Cnwanglin 2005-10-13
  • 打赏
  • 举报
回复
前两天刚好有人发过帖子,这种算法不是特别麻烦的,最好是自己写
Cnwanglin 2005-10-13
  • 打赏
  • 举报
回复
/*
*功能:判断链表中是否存在节点
*名称:is_circle(struct list *)
*传入参数:struct list* 链表的首地址
*返回值:int (1)为0,链表中无循环
(2) 为1,链表中有循环
*/
int is_circle(struct list *head)
{
//判断节点的个数为0或者1个的时候,不可能存在循环
if(head==null&&head->next==null) return 0;

//定义指针p,q,分别指向head; head->next;
list *p=head;
list *q=head->next;
//判断节点的个数为2个的时候,如果不是循环,退出;
if(q->next==null) return 0;
q=q->next;

//循环判断
while(p!=null&&q!=null)
{
if(p==q)
//存在循环,退出
return 1;
else
{
p=p->next;
q=q->next;
//指针q的STEP为2,要加上这句判断;(q + 1)是否为链表的终点
if(q->next==null) return 0;
//(q + 2)
q=q->next;
}
}

return 0;
}
  • 打赏
  • 举报
回复
两个指针从头开始遍历, 一个每次前进 1 , 一个进 2 , 如果每次进1的指针追上了进2 的则有环路, 否则木有哦.
商科程序员 2005-10-13
  • 打赏
  • 举报
回复
// 返回值:返回1为有环路,返回0为无回路
// 参 数:假设Node链表节点类型, head 是头节点指针
// struct Node { int x; Node *next;}
// Node.x在本程序中无用, 只是让结点内容更丰富一点儿

int judge(Node* head)
{
if (head == NULL)
{
printf("ERROR: Head is NULL!");
return 0;
}
Node* p;
Node* q;
int p_counter = 0; //节点计数器,计算指针p指向的是第几个节点
int q_counter = 0; //节点计数器,计算指针q指向的是第几个节点
p = head;
while (1)
{
p = p->next;
if (p == NULL) //如果p为NULL,说明链表有终点,也就说明无循环
return 0;
else
p_counter += 1;
q = head;
q_counter = 0;

while (1)
{
q = q->next;
q_counter += 1;
if (q != p)
break;
esle if (q_counter == p_counter)
break;
else
return 1;
}
}
}

以上程序只是凭感觉写的, 并没有在机器上试运行, 如有错误, 请指正.
程序思想:用P把链表计数遍历一遍,每移动一次P指针,都让Q也计数遍历到P,
计数值不先等的话,就说明有循环了。

这种方法只要长度小于正INT的链表都能检测,大于的话可以改变计数器类型。

也想过用一个数组存储每个节点地址,P每走一次都存一下地址,然后从数组头
开始比较地址,但这种方法的时间复杂性与上面的方法一样,但空间复杂性高,
而且链表的长度是不定的,不能确定数组长度。
nonlyli 2005-10-13
  • 打赏
  • 举报
回复
呵呵,楼上,每个结点都要加一个标志位,不是空间代价么?

而且,还要修改链表的结构。

要将算法用在已经存在的链表上,才算好。
jsjjms 2005-10-13
  • 打赏
  • 举报
回复
每个结点设置一个标志位,每次到该结点就将标志位置0xff,那么如果遍历到某个结点已经
是0xff了,那么表示该链表有回路.
dongzhongwei 2005-10-13
  • 打赏
  • 举报
回复
如果是单链表且有回路,那么从头遍历一下死循环则有回路。因为单连表如有回路必定就没了空指针来结束连表。
ErikChen1985 2005-10-13
  • 打赏
  • 举报
回复
回复人: jsjjms(找回真我!!!) ( ) 信誉:100
每个结点设置一个标志位,每次到该结点就将标志位置0xff,那么如果遍历到某个结点已经
是0xff了,那么表示该链表有回路.
这个方法实现起来比较简单,但需要付出空间代价。
也可以直接比较 node_current->next 节点的index值是否小于node_current 节点的index值(如果有index属性 )


为什么说这个算法需要付出空间代价???
icecools 2005-10-13
  • 打赏
  • 举报
回复
sorry, 贴错帖子了
icecools 2005-10-13
  • 打赏
  • 举报
回复
Reboot Method of the Win32_OperatingSystem Class
The Reboot WMI class method shuts down the computer system, then restarts it. On computers running Windows 2000 and Windows NT, the calling process must have the SE_SHUTDOWN_NAME privilege.

This topic uses Managed Object Format (MOF) syntax. For information on using this method see Calling a Method.

uint32 Reboot();

Parameters
This method has no parameters.
Return Values
Returns zero (0) to indicate success. Any other number indicates an error.

Example Code

For script examples, see WMI Tasks for Scripts and Applications and the TechNet ScriptCenter Script Repository.

For C++ example code, see WMI C++ Application Examples.


Requirements
Client Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0 SP4 and later.
Server Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0 SP4 and later.
MOF Declared in Cimwin32.mof.

DLL Requires Cimwin32.dll.
Namespace Defined in \root\cimv2.


See Also
Operating System Classes, Win32_OperatingSystem
AntonlioX 2005-10-13
  • 打赏
  • 举报
回复
是如何判别一个链表是否含有回路
AntonlioX 2005-10-13
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
#include <stdio.h>

struct foo_node
{
struct foo_node* next;
int foo_info;
};

int slove( struct foo_node* head )
{
struct foo_node *fst = head, *scd = head;

while( scd->next && scd->next->next )
{
if( fst == scd->next || fst == fst->next->next ) return 1;
fst = fst->next; scd = scd->next->next;
}

return 0;
}

int main()
{
struct foo_node node1 , node2 , node3 , node4;

node1.next = &node2;
node2.next = &node3;
node3.next = &node4;
node4.next = NULL;

printf( "%d\n" , slove( &node1 ) );

node4.next = &node2;

printf( "%d\n" , slove( &node1 ) );
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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