这里我正在试验三个链表(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
您的错误在于,您假定list
、list2
和list3
是指整个列表。它们是指向每个列表的第一个元素的简单指针,所以-
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;