我想編寫一個函數,可以讓我在某個位置插入一個鏈表到另一個鏈表這樣如果鏈表是:如何將鏈接列表插入另一個鏈表中?
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;
}
我很困惑。每個「頭」都指向同一個節點,還是會有不同的頭?你是否更新'list2'的每個'head',因爲它現在是'list1'的一部分,因爲你只是複製指針而不是數據?哪裏是更新'list1'和'list2'的'tail'指針的代碼? –
我以爲我必須保持list2不變,所以它的指針保持不變,因爲它必須在函數調用後保持可用。 – user6005857
您的'node'結構將兩個東西 - 列表中的節點('item'和'next')以及列表的總體開始和結束('head'和'last')混合在一起。爲保持一致性,每次添加或刪除列表頭部或尾部的項目時,都必須遍歷整個列表以更新「head」和「last」指針。當您將一個列表插入另一個列表時,必須更新插入列表中的所有指針,以指向它所插入列表的頭部和尾部。等分開兩組數據。 –