如何将链接列表插入另一个链表中?
我想编写一个函数,可以让我在某个位置插入一个链表到另一个链表这样如果链表是:如何将链接列表插入另一个链表中?
list1: [1]->[2]->[3]->NULL
list2: [4]->[5]->[6]->NULL
然后调用该函数:
insertList(list1, list2, 1);
修改list1,使得:
list1 = [1]->[4]->[5]->[6]->[2]->[3]->NULL
和list2保持未修改和可用。
这里是结构定义:
struct _node {
int item;
struct _node *next;
}
struct _list {
struct _node *head;
struct _node *last;
}
这里是我的尝试,因为我得到赛格故障不工作。
void insertList(struct _list *list1, struct _list *list2, int pos) {
assert(list != NULL && list2 != NULL);
int currPos = 0;
struct _node *curr = list1->head;
if (pos < 0 || pos >= numLines(list1)) {
abort();
}
// traverse linked list to get to correct position
while (curr != NULL && currPos != pos) {
curr = curr->next;
currPos++;
}
struct _node *temp = curr->next;
curr->next = list2->head;
while (curr != NULL) {
curr = curr->next;
}
curr->next = temp;
// updating last
curr = list1->head;
while (curr != NULL) {
curr = curr->next;
}
list1->last = curr;
}
while (curr != NULL) {
curr = curr->next;
}
- >在这个位置curr
是NULL
,然后你做
curr->next = temp; //NULL->next gives you seg fault.
你可能想
while (curr->next != NULL){
...
}
你也将不得不改变的最后一部分
while (curr != NULL) {
curr = curr->next;
}
list1->last = curr; //here also curr is NULL, you need to rull the loop
//till curr->next!=NULL
谢谢,但我在进行这些更改后仍然遇到seg故障。 – user6005857
对于哪些输入,你会得到seg故障?与问题中提到的一样? –
示例中的相同输入。 – user6005857
我很困惑。每个“头”都指向同一个节点,还是会有不同的头?你是否更新'list2'的每个'head',因为它现在是'list1'的一部分,因为你只是复制指针而不是数据?哪里是更新'list1'和'list2'的'tail'指针的代码? –
我以为我必须保持list2不变,所以它的指针保持不变,因为它必须在函数调用后保持可用。 – user6005857
您的'node'结构将两个东西 - 列表中的节点('item'和'next')以及列表的总体开始和结束('head'和'last')混合在一起。为保持一致性,每次添加或删除列表头部或尾部的项目时,都必须遍历整个列表以更新“head”和“last”指针。当您将一个列表插入另一个列表时,必须更新插入列表中的所有指针,以指向它所插入列表的头部和尾部。等分开两组数据。 –