• leetcode链表--7、rotate-list(将单链表从右数第k个结点以及之后结点移动到链表最前头)


    题目描述
     
    Given a list, rotate the list to the right by k places, where k is non-negative.
    For example:
    Given1->2->3->4->5->NULLand k =2,
    return4->5->1->2->3->NULL.
     
    解题思路:本题实际上就是--将单链表从右数第k个结点以及之后结点移动到链表最前头
    1)找到链表的倒数第k个结点(此处注意k可能大于链表长度,所以是k%num)
    2)定义2个指针,p2先移动k%num步   p1指向链表头
    3)两个指针同时移动直到p2->next = NULL
    4)然后此时让p2 ->next = head;   然后让p2 = p1->next  确定返回时的头指针
    5)p1->next = NULL 让已经构成的环链表断开
    6)p2即为返回
     
    注意事项:
    1)空指针的判断
    2)链表节点正好等于k,返回原链表
    3)其他的就找倒数第k个结点即可,即k%num
     1 #include <iostream>
     2 #include <malloc.h>
     3 using namespace std;
     4 struct ListNode {
     5     int val;
     6     ListNode *next;
     7     ListNode(int x) : val(x), next(NULL) {}
     8  };
     9  /*-----------------------------创建链表(不带头结点)---------------------------------*/
    10 /*在链表的末端插入新的节点,建立链表*/
    11 ListNode *CreateList(int n)
    12 {
    13     ListNode *head;//指向头结点指针
    14     ListNode *p,*pre;
    15     int i;
    16     head=(ListNode *)malloc(sizeof(ListNode));//为头节点分配内存空间
    17     head->next=NULL;//将头结点的指针域清空
    18     pre=head;//先将头结点首地址赋给中间变量pre
    19     for(i=1;i<=n;i++)//通过for循环不断加入新的结点
    20     {
    21         p=(ListNode *)malloc(sizeof(ListNode));//为要插入的节点分配
    22         //内存空间p指向新插入结点的首地址
    23         cin>>p->val;//输入数值
    24         pre->next=p;//将p指向新结点插入链表也就是头结点指针域指向
    25         //下个结点
    26         //第一个结点就是p指向的,因为头结点内容为空
    27         pre=p;//这个起着指向下一个结点的作用  等价于pre=pre->next
    28     }
    29     p->next=NULL;//最后将最后一个结点的指针域清空了
    30  
    31     return head->next;//不带空的头结点
    32 }
    33 /*-------------------------输出链表-----------------------------------*/
    34 void PrintList(ListNode *h)
    35 {
    36     ListNode *p;
    37  
    38     p=h;//不带空的头结点
    39     while(p)
    40     {
    41         cout<<p->val<<" ";
    42         p=p->next;
    43         cout<<endl;
    44     }
    45 }
    46 class Solution {
    47 public:
    48     //1、一个指针p2先移k
    49     //2、两个指针一起移动p1、p2
    50     //3、p2->next = head
    51     //4、p2的头结点从p1->next开始,p1为最后一个节点指向空
    52     ListNode *rotateRight(ListNode *head, int k) {
    53         if(head == NULL)//空链表判断
    54             return NULL;
    55         int num = 0;//记录链表中结点个数
    56         ListNode *p = head;
    57         while(p!= NULL)
    58         {
    59             p = p->next;
    60             num++;
    61         }
    62         if(k%num == 0)//正好是长度的正数倍不需要移动,否则移动k%num
    63             return head;
    64         ListNode *p1 = head;
    65         ListNode *p2 = head;
    66         for(int i=0;i<k%num;i++)
    67         {
    68             p2 = p2->next;
    69         }
    70         while(p2->next != NULL)
    71         {
    72             p1 = p1->next;
    73             p2 = p2->next;
    74         }
    75  
    76         p2->next = head;
    77         p2 = p1->next;
    78         p1->next = NULL;
    79         return p2;
    80     }
    81 };
    82 int main()
    83 {
    84     ListNode *h;
    85     int n;
    86     cout<<"输入链表节点个数:"<<endl;
    87     cin>>n;
    88     int k;
    89     h = CreateList(n);
    90     cout<<"原链表:"<<endl;
    91     PrintList(h);
    92     Solution s;
    93     cout<<"输入k的值"<<endl;
    94     cin>>k;
    95     h = s.rotateRight(h,k);
    96     cout<<"变化后链表:k为"<<k<<endl;
    97     PrintList(h);
    98     return 0;
    99 }

    程序输出结果:

  • 相关阅读:
    11 [异常]-try...except
    3-4 网络编程 练习题
    31 选课系统
    3-3 面向对象 本章总结
    3-2 面向对象中级练习题
    3-1 面向对象练习题
    11 [面向对象]-面向对象的软件开发
    10 [面向对象]-元类
    App集成极光推送开发流程[关键步骤]
    App集成极光推送步骤
  • 原文地址:https://www.cnblogs.com/qqky/p/6834809.html
Copyright © 2020-2023  润新知