2015-10-31 45 views
1

我在嘗試在C編程中將鏈表分成一半時遇到了一些問題。這裏是代碼:將C編程分裂鏈表鏈接到一半

typedef struct _listnode { 
    int item; 
    struct _listnode *next; 
} ListNode;   // You should not change the definition of ListNode 

typedef struct _linkedlist { 
    int size; 
    ListNode *head; 
} LinkedList; 

} 
+0

SplitLinkedList不應該返回-1,因爲它是void –

+0

Opps是一個錯誤。任何想法爲什麼這樣表現? –

+0

通常,這是通過使用兩個指向節點的指針完成的。一個指針每次高級兩個節點,另一個節點一次。然後兩個節點在一個時間指針到達列表的末尾,一次一個節點的指針位於列表的中間。 – rcgldr

回答

0

你不這麼說,但我認爲當你將列表分成兩部分時,你不想保留原始列表。如果是這樣,你只需要找到切的聯繫,例如:

head1 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> NULL  head2 -> NULL 

head1 -> 1 -> 2 -> 3 -> NULL  head2 -> 4 -> 5 -> 6 -> NULL 

在這裏,你必須確定第一loist,tail的新尾巴,在本例中節點3.設置頭的新列表tail->next,將tail->next設置爲NULL,然後調整列表中的計數。

您的代碼中的奇數和偶數不需要不同的分支。如果列表的節點數量爲奇數,則一個列表中將有一個節點多於另一個:left = total/2將使右列表更長,left = (total + 1)/2會使左列表更長。只需選擇一個即可完成。

+0

但我無法更改鏈接列表和列表節點的結構。任何想法如何解決這一問題?我認爲這是因爲我正在更新我的頭部指針?而對於剛剛挑選的人來說,那是什麼意思?對不起,我很困惑 –

+0

我的答案不需要改變列表或節點的結構。順便說一句,你泄漏了刪除節點的內存。我的方法更簡單快捷。 –

+0

但我以爲你在用尾巴? Tail是LinkedList結構的一部分嗎? –