笔试题74. LeetCode OJ (61)

Posted _从未止步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题74. LeetCode OJ (61)相关的知识,希望对你有一定的参考价值。

    Rotate List

   这个题的意思旋转链表,更具体点的意思右移链表,移出去的节点放到头部前面,结合着题目给出的例子还是很好理解的。

    这个题的主要思路是:摘取从末尾到头的k个节点,然后将他们放到头部。

需要注意的是,上面说的k并不一定等于传入的k的值,因为这个k很可能比链表的长度还大。所以我主要思路是:遍历一遍链表,找到链表的长度n,然后k%=n(这时候k<n,我们更喜欢的是此时k=0),这样就可以找出实际需要移动的节点的个数,然后将链表的最后k个节点放到链表的前面就行了。大概方法是这样的:


    这是大体上的思路,还有一些细节的地方,比如一些优化方面的做法,我在代码中,给出了注释,虽然不是很有特色,但是可以减少一额外的操作,代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) 
    {
        if (head == NULL || head->next == NULL || k == 0)
		{ //0个元素,1个元素,或者k=0
			return head;
		}
		
		ListNode* newHead = NULL;

		int lenOfList = 1;
		ListNode * tmp = head;
		while (tmp->next)
		{//这样的写法最终能使tmp指向最后一个节点,而不是NULL
			++lenOfList;
			tmp = tmp->next;
		}
		//之所以让tmp指向最后一个节点,因为最后的时候tmp需要连接头节点。

		k %= lenOfList;
		if(k == 0)
		{ // 我也很喜欢这种情况,^_^
		    return head;
		}

		ListNode* cur = head;
		for (int i = 0; i < lenOfList - k - 1; ++i)
		{ //为什么移动 lenOfList-k-1 次,不理解的需要画个图看看,因为cur初始化值为head
			cur = cur->next;
		}
		//节点的连接
		newHead = cur->next;
		cur->next = NULL;
		tmp->next = head;

		return newHead;    
    }
};
最终的结果:


以上是关于笔试题74. LeetCode OJ (61)的主要内容,如果未能解决你的问题,请参考以下文章

笔试题56. LeetCode OJ (43)

笔试题58. LeetCode OJ (45)

笔试题57. LeetCode OJ (44)

笔试题55. LeetCode OJ (42)

笔试题65. LeetCode OJ (52)

笔试题54. LeetCode OJ (41)