循环链表中两个节点之间的距离
Distance between two nodes in circular linked list
我想求循环链表中两个节点之间的距离(它们之间的节点数)
节点在哪里:
typedef struct node
{
int data;
struct node *next;
}nodal;
nodal *distance(nodal *start)
{
int n1,n2,d1=0,d2=0,c=0;
if(start==NULL)
{
printf("\nList is empty");
}
else
{
printf("\nEnter the fist node element : ");
scanf("%d",&n1);
printf("\nEnter the second node element : ");
scanf("%d",&n2);
nodal *ptr=start;
while(ptr->next!=start)
{
c++;
if(ptr->data==n1)
{
d1=c;
}
if(ptr->data==n2)
{
d2=c;
}
}
}
printf("The distance between two nodes is %d",(d2-d1));
return start;
}
我没有给出任何输出。
还假设循环列表是否包含以下数据:
1,2,3,4,5,6,7,8,9
如果我提供输入
First node element as 9
Second node element as 4
那这个算法就不行了。
对更改有什么建议吗?
找到第一个节点时开始计数,找到第二个节点时停止计数,例如:
int inc = 0, dist = 0;
if (n1 == n2) {
return 0;
}
node = start;
while (node) {
dist += inc;
if ((node->data == n1) || (node->data == n2)) {
if (inc++ == 1) return dist;
}
node = node->next;
if (node == start) break;
}
return 0;
首先要到输入的第一个元素,这个过程中计数不会增加。然后开始递增计数,直到到达第二个元素。
代码如下:
ptr=start;
while(ptr->data!=n1)
{
ptr=ptr->next;
}
//---now we have reached the first number----
while(ptr->data!=n2)
{
count++;
ptr=ptr->next;
}
您的代码中存在多个问题:
- 列表末尾的测试阻止您测试最后一个节点。
- 您通过返回
0
来处理 n1 == n2
的情况,这可能不是预期的。
- 如果
n2
出现在n1
之前,n1
和n2
之间的距离将为负,这是不正确的:因为列表是循环的,如果你一直扫描在n1
之后,绕过第一个节点后,你最多会在正距离遇到n2
。
这是另一种解决方案:
typedef struct node {
int data;
struct node *next;
} nodal;
nodal *distance(nodal *start) {
int n1, n2, d1 = 0, d2 = 0, length = 0;
if (start == NULL) {
printf("List is empty\n");
} else {
printf("\nEnter the fist node element : ");
if (scanf("%d", &n1) != 1) {
printf("invalid input\n");
return start;
}
printf("\nEnter the second node element : ");
if (scanf("%d", &n2) != 1) {
printf("invalid input\n");
return start;
}
nodal *ptr = start;
for (;;) {
length++;
if (ptr->data == n1 && !d1) {
d1 = length;
} else if (ptr->data == n2) {
if (d1) {
d2 = length;
break;
}
if (!d2)
d2 = length;
}
ptr = ptr->next;
if (ptr == start)
break;
}
}
if (d1 && d2) {
int dist = d2 - d1;
if (dist < 0)
dist += length;
printf("The distance between node(%d) and node(%d) is %d\n", d1, d2, dist);
} else {
if (d2)
printf("node(%d) not found\n", d1);
if (d1)
printf("node(%d) not found\n", d2);
}
return start;
}
我想求循环链表中两个节点之间的距离(它们之间的节点数)
节点在哪里:
typedef struct node
{
int data;
struct node *next;
}nodal;
nodal *distance(nodal *start)
{
int n1,n2,d1=0,d2=0,c=0;
if(start==NULL)
{
printf("\nList is empty");
}
else
{
printf("\nEnter the fist node element : ");
scanf("%d",&n1);
printf("\nEnter the second node element : ");
scanf("%d",&n2);
nodal *ptr=start;
while(ptr->next!=start)
{
c++;
if(ptr->data==n1)
{
d1=c;
}
if(ptr->data==n2)
{
d2=c;
}
}
}
printf("The distance between two nodes is %d",(d2-d1));
return start;
}
我没有给出任何输出。
还假设循环列表是否包含以下数据:
1,2,3,4,5,6,7,8,9
如果我提供输入
First node element as 9
Second node element as 4
那这个算法就不行了。 对更改有什么建议吗?
找到第一个节点时开始计数,找到第二个节点时停止计数,例如:
int inc = 0, dist = 0;
if (n1 == n2) {
return 0;
}
node = start;
while (node) {
dist += inc;
if ((node->data == n1) || (node->data == n2)) {
if (inc++ == 1) return dist;
}
node = node->next;
if (node == start) break;
}
return 0;
首先要到输入的第一个元素,这个过程中计数不会增加。然后开始递增计数,直到到达第二个元素。
代码如下:
ptr=start;
while(ptr->data!=n1)
{
ptr=ptr->next;
}
//---now we have reached the first number----
while(ptr->data!=n2)
{
count++;
ptr=ptr->next;
}
您的代码中存在多个问题:
- 列表末尾的测试阻止您测试最后一个节点。
- 您通过返回
0
来处理n1 == n2
的情况,这可能不是预期的。 - 如果
n2
出现在n1
之前,n1
和n2
之间的距离将为负,这是不正确的:因为列表是循环的,如果你一直扫描在n1
之后,绕过第一个节点后,你最多会在正距离遇到n2
。
这是另一种解决方案:
typedef struct node {
int data;
struct node *next;
} nodal;
nodal *distance(nodal *start) {
int n1, n2, d1 = 0, d2 = 0, length = 0;
if (start == NULL) {
printf("List is empty\n");
} else {
printf("\nEnter the fist node element : ");
if (scanf("%d", &n1) != 1) {
printf("invalid input\n");
return start;
}
printf("\nEnter the second node element : ");
if (scanf("%d", &n2) != 1) {
printf("invalid input\n");
return start;
}
nodal *ptr = start;
for (;;) {
length++;
if (ptr->data == n1 && !d1) {
d1 = length;
} else if (ptr->data == n2) {
if (d1) {
d2 = length;
break;
}
if (!d2)
d2 = length;
}
ptr = ptr->next;
if (ptr == start)
break;
}
}
if (d1 && d2) {
int dist = d2 - d1;
if (dist < 0)
dist += length;
printf("The distance between node(%d) and node(%d) is %d\n", d1, d2, dist);
} else {
if (d2)
printf("node(%d) not found\n", d1);
if (d1)
printf("node(%d) not found\n", d2);
}
return start;
}