c-打印链接列表的所有交替节点



我正在尝试浏览一个链表,并同时打印所有交替的节点。我不允许创建第二个列表/数组来存储所有备用节点值。到目前为止,我已经能够使用下面的代码浏览交替的节点。然而,当它在节点中循环时,它将继续打印值。。。

假设列表是[1,2,3,4]

NodeT *p;
NodeT *a;
p = list;
while (p != NULL)
{
printf("p is %d-->", p->data);
a = p->next;
printf("a is %d-->", a->data);
p = p->next->next;
}

目前的结果是:p是1->a是2->p是3->a是4->

我正在寻找的结果是:

p是1->3.a是2->4

有没有什么方法可以在不创建任何新列表/数组的情况下实现这一点?

您不能希望用一个循环产生输出,因为您希望首先打印奇数位置的所有节点,然后打印偶数位置的所有节点。因此,使用两个循环,甚至更好:创建一个执行循环和打印的函数,并调用它两次——一次使用list,第二次使用list->next:

void printAlternating(NodeT *p) {
while (p != NULL) {
printf("%d-->", p->data);
p = p->next;
if (p == NULL) break;
p = p->next;
}
printf("NULLn");
}

使用上述功能如下:

printf("p is ");
printAlternating(list);
printf("a is ");
printAlternating(list == NULL ? NULL : list->next);

一个完整的工作程序:

#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} NodeT;
NodeT *createNode(int data, NodeT *next) {
NodeT *p = malloc(sizeof (NodeT));
p->data = data;
p->next = next;
return p;
}
void printAlternating(NodeT *p) {
while (p != NULL) {
printf("%d-->", p->data);
p = p->next;
if (p == NULL) break;
p = p->next;
}
printf("NULLn");
}
int main() {
NodeT *list = createNode(1, 
createNode(2,
createNode(3,
createNode(4, NULL))));
printf("p is ");
printAlternating(list);
printf("a is ");
printAlternating(list == NULL ? NULL : list->next);
}

输出:

p is 1-->3-->NULL
a is 2-->4-->NULL

在访问a的字段之前,您应该更新指针p并检查a不是NULL

这是一个修改版本:

void print_alternating_nodes(NodeT *list) {
NodeT *p;
NodeT *a;
p = list;
while (p != NULL) {
printf("p is %d --> ", p->data);
a = p = p->next;
if (a) {
printf("a is %d --> ", a->data);
p = p->next;
}
}
}

使用c++列表完成(以避免编写列表实现(,但同样的想法也可以在c中完成。只需提前阅读即可。

std::list<int> l{1,2,3,4,5,6};
auto it = l.begin();
int a = *it++; // should really test for 0 or 1 element only in list
int b = *it++;
while (it != l.end())
{
int c = *it++;
std::cout << a << "->" << c << "n";
a = b;
b = c;
}

输出

1->3
2->4
3->5
4->6

最新更新