[LeetCode]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为非负数。

解题思路


此题可以划归为下面的需依次解决的问题:
  1. 得到新的k值,k = k % length;(当k大于链表长度时,会再一次旋转)
  2. 得到链表中倒数第k+1个节点;
  3. 将倒数k+1个节点指向null,倒数第k个节点之前的节点移到原链表尾节点之后;
对于第二步,我们可以使用两个指针来完成。使用两个指针,指针1首先走k步,然后指针2开始走,指针1走完时即得到题目要求的节点。

代码


public static ListNode rotateRight(ListNode head, int n) {
		if (head == null)
			return null;

		ListNode p1 = head;
		ListNode p2 = head;
		ListNode tempNode = null;
		int len = 0;
		int i = 1;

		while (p1 != null) {
			p1 = p1.next;
			len++;
		}
		
		n %= len;//求得实际旋转的节点个数
		p1 = head;
		
		//得到正数第k个节点
		while (p1 != null && i <= n) {
			p1 = p1.next;
			i++;
		}
		
		if(p1==null){
			return head;
		} else {
			//得到倒数第k+1个节点,即循环完后的p2节点
			while(p1.next!=null){
				p1 = p1.next;
				p2 = p2.next;
			}
			
			p1.next = head;//原链表尾节点指向原链表头节点
			
			//原链表倒数第k+1个节点指向null,新头节点为原链表倒数第k个节点
			tempNode = p2.next;
			p2.next = null;
			p2 = tempNode;
			
			return p2;
		}
	}


你可能感兴趣的:([LeetCode]Rotate List)