题解 | #旋转链表#

旋转链表

https://www.nowcoder.com/practice/1ad00d19a5fa4b8dae65610af8bdb0ed

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* rotateLinkedList(ListNode* head, int k) {
        // write code here
        if(!head||!head->next||!k){
            return head;
        }//防止传参:空指针、单节点、空旋转数量
        ListNode* dummy=new ListNode(0);
        dummy->next=head;//0头节点指向首节点
	  
        int count=0;//链表节点数量计数器
        ListNode* end=dummy;
        while(head){
            count++;
            end=end->next;//同时end指针指向链表的结尾部分
            head=head->next;
        }
       
        if(k>count){//如果k移动的数量超过了节点数量,则其实就是移动了对K取余的数量,比如长7的链表移动7次还是本身。这一点我一开始没有想到,测试的时候才想到。
            k=k%count;
        }
	  
	  ListNode* start=dummy;
        for(int i=0;i<count-k;k++){//start指针指向要断开的前半截的末尾节点
            start=start->next;
        }
        ListNode* then=start->next;//then指针指向要断开的后半截的首节点
	  
        end->next=dummy->next;//开始进行重新链接
        dummy->next=then;
        start->next=nullptr;

        ListNode* result=dummy->next;//释放堆空间,防止内存泄露
        delete dummy;
        return result;

        

    }
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务