c-如何将绑定在一个指针到指针中的多个链表合并为一个



这里我正在试验三个链表(list1、list2、list3(,将它们放在**列表中。我正在尝试合并它们,但我如何访问/浏览其中的值来开始工作呢?

struct ListNode {
int val;
struct ListNode *next;
};
int main() {
struct ListNode a; struct ListNode b; struct ListNode c;
a.val = 1; b.val = 4; c.val = 5;
a.next = &b; b.next = &c; c.next = NULL;
struct ListNode* list1 = &a;
struct ListNode d; struct ListNode e; struct ListNode f;
d.val = 1; e.val = 3; f.val = 4;
d.next = &e; e.next = &f; f.next = NULL;
struct ListNode* list2 = &d;
struct ListNode g; struct ListNode h;
g.val = 2; h.val = 6;
g.next = &h; h.next = NULL;
struct ListNode* list3 = &g;
list1->next = list2; list2->next = list3; list3->next = NULL;
struct ListNode** lists = list1;
}

您是否试图串行连接这三个列表,以便list1的最后一个元素指向list2的第一个元素,依此类推?

你可以简单地做-

// c is the last element of list 1. list2 is already a pointer to a struct ListNode
c.next = list2 // this is exactly equivalent to c.next = &d

// similarly, f is the last element of list 2. list3 is already a pointer to a struct ListNode
f.next = list3 // this is exactly equivalent to f.next = &g

最初的名单是

a -> b -> c ->

d -> e -> f ->

g -> h ->

完成上述步骤后,您将拥有-

a -> b -> c -> d -> e -> f -> g -> h

您的错误在于,您假定listlist2list3是指整个列表。它们是指向每个列表的第一个元素的简单指针,所以-

list1->next = list2

list1(a(指向的节点的next值设置为list2的第一个节点的地址

您必须找到列表的最后一个元素,并将其分配给要合并的列表的第一个元素。


除非这是一次性的,否则我建议您定义一个子程序,该子程序接受指向两个列表的指针并串行连接它们。类似这样的东西-

void joinNodes(ListNode* first, ListNode* second) {
// loop through first until the last element (say, x) is found
// set next of x to second
// end
}

实现留给读者练习。

FYI:有时链接列表类与该链接列表上的节点是不同的。有时它们是相同的类。在您的情况下,您使用ListNode作为链表和链表上的节点。

如果你想附加列表1->4->5->1->3->4->2->6->您希望实现一个助手函数,该函数将迭代到链接列表的END并返回最后一个元素。我已经有一段时间没有编码任何C了,所以预计会有语法错误,但类似于:

ListNode* getLastNodeFromLinkList(ListNode* n){
if(n == NULL) return NULL;
while(n->next != NULL){
n = n->next;
}
return n;
}

然后你可以做一些类似的事情:

struct ListNode* x;
x = getLastNodeFromLinkList(list1);
x->next = list2;
x = getLastNodeFromLinkList(list2);
x->next = list3;

相关内容

  • 没有找到相关文章