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 }

程序输出结果:

posted @ 2017-05-10 10:53  qqky  阅读(326)  评论(0编辑  收藏  举报