[LeetCode][Java] Rotate List

题目:

Given a list, rotate the list to the right by k places, where k is non-negative.

For example:

Given 1->2->3->4->5->NULL and k = 2,

return 4->5->1->2->3->NULL.

题意:

给定一个链表,以距离右边界k点的节点为轴,旋转这个链表,k为非负数。

比如:

Given 1->2->3->4->5->NULL and k = 2,

return 4->5->1->2->3->NULL.

算法分析:

* 给出一个单链表,和一个K值,根据K值往右旋转,例如:

* 注意审题 ,开始以为K点从左边开始呢,debug费了那么大劲~~

K是从右向左数的

  *还需要特别说明的一点是,k的值可能会超过链表中的节点数,这时候需要对k进行取余操作,重新定位k在链表中的位置。当k取余数0时,说明为总节点数的

  *整数倍,这时候依照题意链表不需要进行翻转。

  * [1,2,3,4,5] k=1 ----->[5,1,2,3,4]

* [1,2,3,4,5] k=2 ----->[4,5,1,2,3]

* [1,2,3,4,5] k=3 ----->[3,4,5,1,2]

* [1,2,3,4,5] k=4 ----->[2,3,4,5,1]

参考http://pisxw.com/algorithm/Rotate-List.html

此题解法依旧是利用双指针,基本思路是设置两个指针i,j,中间相差n,用walker-runner定位到要旋转的那个结点,然后将下一个结点设为新表头,并且把当前结点设为表尾。设置前后两个指针,然后推进前进的方法称为尺取法。

AC代码:

<span style="font-size:12px;">/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution
{
    public ListNode rotateRight(ListNode head, int n)
    {
        if(head==null || head.next==null)
            return head;
        ListNode slow=head;      //定义两个指针
        ListNode fast=head;
        ListNode testhead =head;//复制链表,用于后面统计链表中的总的节点数
        int Nodenum=0;         //链表中的节点数
        int k;
    	while(testhead!=null)
     	{
     		Nodenum++;         //统计总共多少节点
     		testhead=testhead.next;
     	}
     	k=n%Nodenum;
     	if(k==0)              //若n正好为节点数的整数倍,就不用翻转链表
     	  return head;
        for(int num=0;num<k;num++)//k取余后重新定位节点进行翻转
            fast=fast.next;

        while(fast.next!=null)
        {
            fast=fast.next;
            slow=slow.next;
        }
        fast.next=head;  //进行旋转
        head=slow.next;
        slow.next=null;
        return head;
    }
}</span>

自己第一遍的AC代码,真叫一个乱啊,舍不得还是记录下吧

<span style="font-size:12px;">public class Solution
{
    public ListNode rotateRight(ListNode head, int k)
    {
		//1->2->3->4->5->NULL
    	//4->5->1->2->3->NULL.
    	int Nodenum=0;
    	ListNode testhead2;
    	ListNode testhead3;
    	ListNode newListone;
    	ListNode newListtwo;
      	ListNode Listtwoend;

    	if(head==null||head.next==null)
    		return head;
    	ListNode testhead =head;

    	while(testhead!=null)
    	{
    		Nodenum++;
    		testhead=testhead.next;
    	}
    	k=k%Nodenum;
    	if(k>=Nodenum||k==0)
    		return head;
    	testhead2=head;
    	testhead3=head;

    	for(int i=1;i<Nodenum-k;i++)
    		testhead2=testhead2.next;
    	for(int i=1;i<=Nodenum-k;i++)
    		testhead3=testhead3.next;

    	newListtwo=testhead3;
    	testhead2.next=null;
    	newListone=head;

    	Listtwoend = newListtwo;
    	while(Listtwoend.next!=null)
    		Listtwoend=Listtwoend.next;
    	Listtwoend.next=newListone;
    	return newListtwo;

    }
}</span>

版权声明:本文为博主原创文章,转载注明出处

时间: 2024-11-02 14:53:54

[LeetCode][Java] Rotate List的相关文章

[LeetCode][Java] Rotate Image

题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 题意: 给定一个 n x n 的二维矩阵,来表示一副图像. 把图像旋转90度(顺时针) 你能否在原矩阵上完成呢? 算法分析: 方法一: 空间复杂度较高,开辟额外的空间开复制原矩阵.但是最好理解 找到规律即可:mat

Rotate List leetcode java

题目: Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL. 题解: 这道题主要先理解题意,就是倒着数k个node,从那开始到结尾和之前那部分对调,那个例子就是,4->5拿前面来,

Rotate Image leetcode java

题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 题解: 这道题就是考察很直白的旋转坐标.要in place的.画个图自己算算就出来了. 代码如下: 1  /*   public void rotate(int[][] matrix) { 2         in

LeetCode:Rotate Array

1.题目名称 Rotate Array(平移数组) 2.题目地址 https://leetcode.com/problems/rotate-array/ 3.题目内容 英文:Rotate an array of n elements to the right by k steps. 中文:将一个长度为n的数组,向右平移k个单位 4.解题方法1 一个比较易于理解的方法是新开辟一个与原数组等长的数组,循环考察原数组的元素,将它们放到新数组中平移后的位置上,最后再将新数组上的元素赋回原数组. 一段可以

[LeetCode] 61. Rotate List 旋转链表

Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: Input: 1->2->3->4->5->NULL, k = 2 Output: 4->5->1->2->3->NULL Explanation: rotate 1 steps to the right: 5->1->2->3-&g

LeetCode --- 61. Rotate List

题目链接:Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL. 这道题的要求是向右旋转链表k步. 其实就是把链表后面l-k个节点放到前面,可以采用快慢指针处理.不

Spiral Matrix leetcode java

题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. For example, Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 题解: 这道题是实现题. 考虑2个初始

Pascal&#39;s Triangle II Leetcode java

题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 题解: 为了达到O(k)的空间复杂度要求,那么就要从右向左生成结果.相当于你提前把上一行的计算出来,当前行就可以用上一次计算出的结果计算了

Spiral Matrix II leetcode java

题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example, Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 题解:这道题跟Spiral Matrix想法也是类似的,就是依照矩阵从外圈到内圈建立