下面例子演示了如何分割乙個鍊錶,並使用**實現。
圖1:原始的迴圈鍊錶
圖2:分割後的迴圈子鍊錶1
圖3:分割後的迴圈子鍊錶2
1) 使用步進分別為1和2的演算法,獲得鍊錶的中間指標以及尾指標;
2) 將後半部分鍊錶形成迴圈鍊錶;
3) 將前半部分鍊錶形成迴圈鍊錶;
4) 設定兩個迴圈鍊錶的頭指標。
在下面的實現中,如果鍊錶中節點個數為奇數,則前半部分鍊錶的個數會比後半部分鍊錶的個數多1。
**實現:
#include //鍊錶節點
struct node ;
//將乙個鍊錶(head)分割為兩個鍊錶。head1和head2分別代表分割後的兩個鍊錶。
void splitlist(node* head, node** head1, node** head2)
//如果有偶數個節點,則移動fastptr
if (fastptr->next->next == head)
fastptr = fastptr->next;
//設定前半部分的頭指標
*head1 = head;
//設定後半部分的頭指標
if (head->next != head)
*head2 = slowptr->next;
//使後半部分形成迴圈鍊錶
fastptr->next = slowptr->next;
//使前半部分形成迴圈鍊錶
slowptr->next = head;
}//在迴圈鍊錶頭部插入新的節點
void push(node** head, int data)
else
newnode->next = newnode; //新節點做為鍊錶第乙個節點
*head = newnode; //調整頭節點
}//列印迴圈鍊錶
void printlist(node* head) while (temp != head);
}}int main()
執行結果:
original circular linked list
1 2 3 4 5 6 7
first circular linked list
1 2 3 4
second circular linked list
5 6 7
時間複雜度:o(n)
2 4 分割鍊錶
template typename t singlylinkednode partition singlylinkednode head,t partition singlylinkednode newhead head singlylinkednode newtail head singlylin...
86 分割鍊錶
給定乙個鍊錶和乙個特定值x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5 思路 用兩個鍊錶分別存小於x和大於等於x的元素,然後連線兩個鍊錶。de...
LeetCode725分割鍊錶
題目 給定乙個頭結點為 root 的鍊錶,編寫乙個函式以將鍊錶分隔為 k 個連續的部分。每部分的長度應該盡可能的相等 任意兩部分的長度差距不能超過 1,也就是說可能有些部分為 null。這k個部分應該按照在鍊錶 現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。返回乙個符合上述規則...