题目描述
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 }
程序输出结果: