zoukankan      html  css  js  c++  java
  • 经典算法问题:链表分段反转

    题目要求:链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现

    思路:这个题和反转字符串部分一个思路。

       若有一条链表1→2→3→4→5→6,k=2。 

       第一步:将链表分为两段 x=1->2,y=3→4→5→6

       第二步:分别将x y反转 得:x=2->1 , y=6->5->4->3

         第三步:链接x,y;

    c++11版:

     1 int main()
     2 {
     3     list<int>a{ 1, 2, 3, 4, 5, 6 };
     4     list<int>b;
     5     auto p = a.begin();
     6     while (*p != 3)
     7     {
     8         b.push_front(*p);
     9         p++;
    10     }
    11     b.push_front(*p);
    12     while (p != a.end())
    13         b.insert(b.end(),*p++);
    14     for (auto &u : b)
    15     {
    16         cout <<u << endl;
    17     }
    18 
    19     getchar();
    20 }

    C版:

     1 typedef struct l{
     2     int data;
     3     l* next;
     4 }l;
     5 l* reverse(l* head,int num)
     6 {
     7     if (head == NULL || num <= 0) return NULL;
     8     l* p = head;// p 用来遍历原链表 1->2->3->4->5->6->NULL
     9     l* node = NULL; // node 指向的链表 :k->...->1
    10     l* node2 = NULL;// node2 指向剩下的
    11     l* flag = NULL;//指向 node 最后的结点,在链接两个链表时用
    12     l*q = NULL;//指向新的结点
    13     while (p->data != num)
    14     {
    15         q = (l*)malloc(sizeof(l));
    16         q->data = p->data;
    17         if (node == NULL)
    18         {
    19             q->next = NULL;
    20             node = q;
    21             flag = node;
    22             p=p->next;
    23             continue;
    24         }
    25         q->next = node;
    26         node = q;
    27         p = p->next;
    28     }
    29     //这时 p 指向 k ,把 k 的结点插进 node
    30     q = (l*)malloc(sizeof(l));
    31     q->data = p->data;
    32     q->next = node;
    33     node = q;
    34     p = p->next;
    35     //遍历 k 结点后面的结点
    36     while (p != NULL)
    37     {
    38         q = (l*)malloc(sizeof(l)); 
    39         q->data = p->data;
    40         if (node2 == NULL)
    41         {
    42             q->next = node2;
    43             node2 = q;
    44             p = p->next;
    45             continue;
    46         }
    47         q->next = node2;
    48         node2 = q;
    49         p = p->next;
    50     }
    51     flag->next = node2;//合并
    52     return node;
    53 }
    54 
    55 int main()
    56 {
    57     int a[6] = { 1, 2, 3, 4, 5, 6 };
    58     l* link[6];
    59 
    60 //新建链表 1->2->3->4->5->6->NULL
    61     for (int i = 0; i < 6; i++)
    62     {
    63         link[i] = (l*)malloc(sizeof(l*));
    64         link[i]->data = a[i];
    65         link[i]->next = NULL;
    66     }
    67     for (int i = 0; i < 5; i++)
    68     {
    69         link[i]->next = link[i + 1];
    70     }
    71 
    72 //调用函数完成反转
    73     l* tmp = reverse(link[0], 2);
    74 
    75 //输出
    76     for (; tmp != NULL; tmp = tmp->next){
    77         cout << tmp->data << " ";
    78     }
    79     getchar();
    80 }

    嗯嗯 ,就这样把。

    转载请注明:http://www.cnblogs.com/firstcxj/

  • 相关阅读:
    两数之和
    输入一个int型数据,计算出该int型数据在内存中存储时1的个数。
    MySQL事务机制(Transaction)
    JAVA 之 深入理解String类
    MySQL 之 SQL练习
    python常用函数及循环
    python多版本配置pyenv
    ES6语法的简单示例
    学习笔记190—利用matlab求解方程组的解
    学习笔记189—pandas 获取Dataframe元素值的几种方法
  • 原文地址:https://www.cnblogs.com/firstcxj/p/4566318.html
Copyright © 2011-2022 走看看