乐扣T61 OJ2:旋转链表 c++

    技术2022-07-21  77

    问题描述 : 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

    示例 1:

    输入: 1->2->3->4->5->NULL, k = 2

    输出: 4->5->1->2->3->NULL

    解释:

    向右旋转 1 步: 5->1->2->3->4->NULL

    向右旋转 2 步: 4->5->1->2->3->NULL

    示例 2:

    输入: 0->1->2->NULL, k = 4

    输出: 2->0->1->NULL

    解释:

    向右旋转 1 步: 2->0->1->NULL

    向右旋转 2 步: 1->2->0->NULL

    向右旋转 3 步: 0->1->2->NULL

    向右旋转 4 步: 2->0->1->NULL

    输入说明 :

    首先输入链表长度len,然后输入len个整数,以空格分隔。

    再输入非负整数k。

    输出说明 :

    输出格式见范例 输入范例: 5 1 2 3 4 5 2

    输出范例: head–>4–>5–>1–>2–>3–>tail

    #include<iostream> using namespace std; struct ListNode{ int val; struct ListNode *next; ListNode() : val(0), next(NULL) {} ListNode(int x) : val(x), next(NULL) {} ListNode(int x, ListNode *next) : val(x), next(next) {} }; class Solution { public: ListNode* rotateRight(ListNode* head, int k) { //完成该函数的填写 if (!head) return head; int len=1,num; ListNode *p=head,*p_pre,*q; while(p->next){ p=p->next;len++; } k=k%len; if(k==0) return head; num=len-k; p=head; while(num>1){ p=p->next; num--; } p_pre=p; p=p->next; q=p; p_pre->next=NULL; while(p->next) p=p->next; p->next=head; head=q; return head; //不加这一句,LeetCode显示上编译错误(要求有返回值) } }; ListNode *createByTail() { ListNode *head; ListNode *p1,*p2; int n=0,num; int len; cin>>len; head=NULL; while(n<len && cin>>num) { p1=new ListNode(num); n=n+1; if(n==1) head=p1; else p2->next=p1; p2=p1; } return head; } void displayLink(ListNode *head) { ListNode *p; p=head; cout<<"head-->"; while(p!= NULL) { cout<<p->val<<"-->"; p=p->next; } cout<<"tail\n"; } int main() { int k; ListNode* head = createByTail(); cin>>k; head=Solution().rotateRight(head,k); displayLink(head); return 0; }
    Processed: 0.009, SQL: 9