leetcode_61:旋转链表

这个题目也不难,只要分析出来旋转的规律就比较简单了。我看到的规律有两点:

  1. 旋转了k次,其实就是对链表旋转了k % 链表长度次。
  2. 旋转其实就是求倒数第k个节点,然后让这个节点及后面的节点接到头部

有了这两点,代码上可能就是要保存的变量比较多,还是要尝试写一下,但思路不难:

    public ListNode rotateRight(ListNode head, int k) {
        if (head == null || head.next == null)	//如果是个空链表或者只有一个节点,则可直接返回
            return head;
        ListNode tail = head;
        //求链表长度NodesCount
        int NodesCount = 0;
        while (tail != null) {
            NodesCount++;
            tail = tail.next;
        }
        k = k % NodesCount;		//求出实际的倒数第k个,若为0说明不需要旋转,直接返回
        if (k == 0)
            return head;
        //只要涉及到头结点会改变,最好变为带头结点的链表
        ListNode NewHead = new ListNode(0);NewHead.next = head;
        ListNode p = NewHead, q = p;	//让p.next指向倒数第k个,q指向尾节点
        for (int i = 0; i < k; ++i)
            q = q.next;
        while (q.next != null) {
            p = p.next;
            q = q.next;
        }
        //将p后面的链表移动到最开始
        ListNode result = p.next;
        p.next = null;
        q.next = NewHead.next;
        return result;

    }

下图为最后各指针指向的位置,此处有个为0的头结点我没有画出来。
在这里插入图片描述

发布了96 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/reachwang/article/details/103437824
今日推荐