循环链表(4) - 分割链表为两段
2015-06-15 01:19
375 查看
下面例子演示了如何分割一个链表。使用代码对其进行实现。
1) 使用步进分别为1和2的算法,求得链表的中间指针以及尾指针;
2) 将后半部分链表形成循环链表;
3) 将前半部分链表形成循环链表;
4) 设置两个循环链表的头指针。
在下面的实现中,如果链表中节点个数为奇数,则前半部分链表的个数会比后半部分链表的个数多1。
代码实现:
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)
原始的循环链表
分割后的循环子链表1
分割后的循环子链表2
1) 使用步进分别为1和2的算法,求得链表的中间指针以及尾指针;
2) 将后半部分链表形成循环链表;
3) 将前半部分链表形成循环链表;
4) 设置两个循环链表的头指针。
在下面的实现中,如果链表中节点个数为奇数,则前半部分链表的个数会比后半部分链表的个数多1。
代码实现:
#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; }输出:
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)
相关文章推荐
- pycharm4.5.1 注册码 破解
- 文件批量改名
- Git连接github不用每次输入用户名和密码的方法
- jQuery 多个条件检索,多条件检索的第一个和$(this)
- MySQL事务控制语句
- 黑马程序员---基础-概述、封装、构造方法、this和static关键字、继承
- base Tag
- 循环链表(3) - 遍历
- WIN8 自定义控件添加到页面XAML报错的解决方法
- 回溯法
- 指出您的竞争对手在所有的SEO基础方面做得如何
- java list顺序
- 循环链表(2) - 插入节点至已排序链表
- ios 日记3 define和typedef(2)
- 同花顺公式
- Wampserver2.5配置虚拟主机出现403 Forbidden的处理方案
- 循环链表(1) - 介绍以及应用
- Android项目之——Activity悬浮并可拖动
- Android应用程序UI硬件加速渲染的Display List渲染过程分析
- Java中断正在运行的线程