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