C++链表K个节点K个节点的反转((1,2,3,4),如果k是2,反转结果是(2,1,4,3))
2015-05-09 12:50
232 查看
#include <iostream> using namespace std; struct Node { int val; struct Node *next; Node(int x = int()):val(x),next(NULL){} }; struct List { List() { head=NULL; } void Insert(int x) { if(head==NULL) { head = new Node(x); } else { Node *p = head; Node *s = new Node(x); while(p->next!=NULL) { p=p->next; } p->next = s; } } int Size() { Node *p = head; return Size(p); } int Size(Node* p) { if(p==NULL)return 0; return Size(p->next)+1; } void Inverted(int a,int b) { int i = a-1; int j = b-1; int size = Size(); if(size<a || b>size)return ; Node *p = head->next; Node *q = head; Node *prve = NULL;//保存反转节点段前面一个节点. Node *last = NULL;//保存反转节点段后面一个节点. if(a==1) { while(j) { last=p->next; p->next=q; q=p; p=last; j--; } head->next = p; head = q; } else { p = head; q = head; while(i) { prve = p; p=p->next; i--; } while(j) { q=q->next; j--; } last=q->next; Node *save=NULL; Node *m = p->next; Node *n = p; while(p!=last) { save = p->next; p->next = m; m=p; p=save; } prve->next=m; n->next = last; } } void Inverted(int k) { Node *p = head; int i = 1; int count = 0; while(p!=NULL) { p=p->next; count++; } while(count>0) { Inverted(i,i+k-1); if(count>k) { count-=k; i+=k; if(count<=k) continue; } if(count<=k) { i+=count; count-=k; } } } void Show() { Node *p = head; while(p!=NULL) { cout<<p->val<<" "; p=p->next; } cout<<endl; } private: Node *head; }; int main() { int Item; List list; while(cin>>Item,Item!=-1) { list.Insert(Item); }//1 2 3 4 5 6 7 8 list.Inverted(2); list.Show(); return 0; }
复杂链表的复制思路:
struct Node{
Node *next;
Node *other;//随机指向任意一个其他节点,或者指向NULL。
int val;
};
我们现在原来的链表上,如(1,2,3,4,5),每个节点后面复制一个相同的节点,是(1,1,2,2,3,3,4,4,5,5),然后再将心other的指针指向新的相应节点(偶数节点为新的节点),再删除奇数节点,就得到了复杂链表的复制。
给大家提供一个学习C++及查询C++的在线网站,相当与一个APP,www.cplusplus.com。
相关文章推荐
- C++将链表反转的实现
- C++算法之 找出两个链表的公共节点
- 左神的书——《程序员代码面试指南》之删除链表的倒数第k个节点 c++实现
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 双链表的建立,测长度,打印,插入c++代码实例及运行结果
- C++数据结构---链表(链表节点创建)
- 【C/C++】反转链表
- C++数据结构与算法之反转链表的方法详解
- leetcode_[python/C++]_19. Remove Nth Node From End of List(删除链表末第n个节点)
- 开发快很重要——如果只看法语或者产品结果C++似乎很强大,但是参与这个C++的开发过程,就会感觉到这种痛苦(Google也是这个看法)
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- 编写程序:建立一个学生数据链表,每个节点的信息包括如下内容:学号,姓名,性别年龄专业。对链表做如下处理。输入一个学号(专业),如果链表中的节点包含此学号(专业),则删去该结点。
- 单链表的建立,测长度,打印,删除,插入,逆置c++代码实例及运行结果
- 双链表的建立,测长度,打印,插入c++代码实例及运行结果
- 复制含有随机指针节点的链表——C++实现
- 求链表的倒数第K个节点,如果K大于链表长度则返回NULL
- C++单向链表反转
- C++单向链表-查找某个节点
- C++基础之单向链表反转
- 小代码 反转单链表和 反转前K个节点的单链表