C++链表K个节点K个节点的反转((1,2,3,4),如果k是2,反转结果是(2,1,4,3))

#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。

时间: 2024-08-29 23:40:36

C++链表K个节点K个节点的反转((1,2,3,4),如果k是2,反转结果是(2,1,4,3))的相关文章

LeetCode 19——删除链表的倒数第 N 个节点

1. 题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的. 进阶: 你能尝试使用一趟扫描实现吗? 2. 思路 定义两个指针 p1.p2,刚开始两个指针都指向头结点.如果要删除倒数第 N 个结点,我们就让 p2 先前进 N-1 步,这时候 p2 后面的节点个数为 K,那我们要删除的

c 链表之 快慢指针 查找循环节点

参考:http://blog.csdn.net/wenqian1991/article/details/17452715 上面分析了 根据这张图 推倒出 数学公式. 刚接触 不能一下弄明白.下面结合上面文章的分析.仔细推倒一下 , 一般设置 快指针 速度是 慢指针的2倍.及 快指针每次遍历两个指针, 慢指针每次遍历1个指针. 假设上图 快慢指针 在E点相遇,那 相遇点离循环节点D 之间距离是X.  头结点A 离循环节点D 距离为K. 那么在两指针相遇时,各自走过得距离(这里可以吧上图想成是 一个

链表(15)----给定链表中间某个节点,将待插入节点插入给定节点之前

1. 链表定义 typedef struct ListElement_t_ { void *data; struct ListElement_t_ *next; } ListElement_t; typedef struct List_t_{ int size; int capacity; ListElement_t *head; ListElement_t *tail; } List_t; 2.给定链表中间某个节点,将待插入节点插入给定节点之前 先将待插入节点插入给定节点之后,然后交换这两个节

删除链表中倒数第n个节点

1.给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 挑战 O(n)时间复杂度 解题思路:刚开始看到倒数第n个节点,不禁感慨如果是数组就可以直接倒着来了.不过针对链表,一定要想起来最常用的方法---快慢指针.设一个fast和slow指针:快指针先走n步,然后快慢指针一起走,

两个链表相交以及第一个公共节点的问题

判读两个链表是否相交以及如果相交它们的第一个公共节点的问题,主要分这么几种情况: 1)两个链表均不含有环 2)两个链表均含有环 对于一个有环一个没有,那么它们即不相交也没有公共节点 首先定义节点的结构 struct Node { int value; Node *next; }; 判断链表是否有环函数 bool isRingList(Node *head) { if(NULL == head) return false; Node *p1 = head, *p2 = p1->next; whil

Leetcode24---&gt;Swap Nodes in Pairs(交换单链表中相邻的两个节点)

题目:给定一个单链表,交换两个相邻的节点,且返回交换之后的头节点 举例: Given 1->2->3->4, you should return the list as 2->1->4->3. 解题思路: 题目本身很简单,但是要注意一些细节: 1.  两对节点之间的连接 2.  如果只剩下一个节点,则不需要交换 代码如下: 1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4

[LeetCode]78. Remove Nth Node From end of List删除链表中倒数第N个节点

Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5. Note:Given n

lintcode 容易题:Remove Nth Node From End of Lis 删除链表中倒数第n个节点

题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 解题: 要删除倒数第n个节点,我们要找到其前面一个节点,也就是倒数第n+1的节点,找到这个节点就可以进行删除.和上题的思想很类似, 定义两个指针,p和cur,cur指针向前走,走了n

[华为机试练习题]24.删除链表中的反复节点、剩余节点逆序输出

题目 描写叙述: 题目描写叙述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容反复的节点(反复的节点所有删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容反复的节点(反复的节点所有删除).剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]仅仅须要完毕该函数功

【LeetCode-面试算法经典-Java实现】【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】

[019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After remo