原始的循环链表
分割后的循环子链表1
分割后的循环子链表2
1) 使用步进分别为1和2的算法,求得链表的中间指针以及尾指针;
2) 将后半部分链表形成循环链表;
3) 将前半部分链表形成循环链表;
4) 设置两个循环链表的头指针。
#include <iostream> //链表节点 struct Node { int data; Node *next; }; //将一个链表(head)分割为两个链表。head1和head2分别代表分割后的两个链表。 void splitList(Node *head, Node **head1, Node **head2) { Node *slowPtr = head; Node *fastPtr = head; if (head == NULL) return; //如果循环链表节点个数为奇数,则最终fastPtr->next会与head重合 //如果个数为偶数,则fastPtr->next->next会与head重合 while (fastPtr->next != head && fastPtr->next->next != head) { fastPtr = fastPtr->next->next; slowPtr = slowPtr->next; } //如果有偶数个节点,则移动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) { Node *newNode = new Node; Node *temp = *head; newNode->data = data; newNode->next = *head; //如果链表不为空,则将最后一个节点的后向指针设置为新节点 //即新节点变成了新的头节点。 if (*head != NULL) { while (temp->next != *head) temp = temp->next; temp->next = newNode; } else newNode->next = newNode; //新节点做为链表第一个节点 *head = newNode; //调整头节点 } //打印循环链表 void printList(Node *head) { Node *temp = head; if (head != NULL) { do { std::cout << " " << temp->data << " "; temp = temp->next; } while (temp != head); } } int main() { //初始化链表为:1->2->3->4->5->6->7 Node *head = NULL; Node *head1 = NULL; Node *head2 = NULL; push(&head, 7); push(&head, 6); push(&head, 5); push(&head, 4); push(&head, 3); push(&head, 2); push(&head, 1); std::cout << "Original Circular Linked List \n"; printList(head); std::cout << std::endl; //分割链表 splitList(head, &head1, &head2); std::cout << "\nFirst Circular Linked List \n"; printList(head1); std::cout << std::endl; std::cout << "\nSecond Circular Linked List \n"; printList(head2); std::cout << std::endl; return 0; }输出:
原文地址:http://blog.csdn.net/shltsh/article/details/46497793