156-旋转链表问题

题目如下:
给定一个链表头节点head。和一个整数K,将链表左旋转K个节点返回操作结果。
输入:1->2->3->4->5 K = 3
输出:4->5->1->2->3

解题思路:
1、定义指针p初始化指向传入链表的头结点head,遍历传入的链表,走到尾结点处,计算出传入链表的长度size
2、int move = k % size;//计算出实际需要左旋转的结点个数
3、如果move=0,直接return head;如果move不为0,定义指针q初始化指向传入链表的头结点head,进入for循环,让指针q走到需要左旋转的区间链表的尾结点处,然后执行ListNode *s = q->next;//s指向需要旋转的区间链表的尾结点的next ,此时的s指向的结点就是操作完成后的返回新链表的头结点
4、 q->next = NULL;//切割出来需要旋转的区间链表
5、我们知道p指针指向的是传入链表的尾结点,执行p->next = head;//将切割出来的两部分合成
6、return s;//返回操作完成的新链表的头结点

ListNode *rotateRight(ListNode *head, int k)
{
    
    
    if (head==NULL || !head->next==NULL || k == 0)
        return head;
    ListNode *p = head;
    int size = 1;
    while (p!=NULL && p->next!=NULL)//计算出链表的长度size 
    {
    
    
        p = p->next;
        size++;
    }
    
    int move = k % size;//计算出实际需要左旋转的结点个数 
    if (move == 0)
        return head;
        
    ListNode *q = head;

    for (int i = 0; i < move-1; ++i)
        q = q->next;
    ListNode *s = q->next;//s指向需要旋转的区间链表的尾结点的next 
    q->next = NULL;//切割出来需要旋转的区间链表 
    p->next = head;//将切割出来的两部分合成 
    return s;//返回操作完成的新链表的头结点 
}

代码演示图如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LINZEYU666/article/details/113309656
156