迴圈鍊錶 4 分割鍊錶為兩段

2021-07-03 07:11:33 字數 1455 閱讀 3668

下面例子演示了如何分割乙個鍊錶,並使用**實現。

圖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個部分應該按照在鍊錶 現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。返回乙個符合上述規則...