1. 程式人生 > >leetCode練習(61)

leetCode練習(61)

題目:Rotate List 難度:medium 問題描述:

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.

Subscribe to see which companies asked this question

解題思路: 先找到len,然後tail與head相連,再在正確的地方斷開。難點在於怎麼找到斷開的地方。一是從tail再次走len-k%len步,而是在最開始的找到tail時,就將整個連結串列用ArrayList存起來,再直接提出斷點。第二個辦法是明顯的空間換時間~ 方法一程式碼如下:
public class ListNode{
		int val;
		ListNode next;
		ListNode(int x){
			val=x;
		}
	}
	public ListNode rotateRight(ListNode head, int k) {
		if(head==null){
			return head;
		}
        ListNode temp=head;
        int len=1;
        while(temp.next!=null){
        	temp=temp.next;
        	len++;
        }   
        temp.next=head;
        k=k%len;
        for(int i=0;i<len-k-1;i++){
        	head=head.next;
        }
        temp=head;
        head=head.next;
        temp.next=null;
        return head;
    }
方法二程式碼如下:
public ListNode rotateRight3(ListNode head, int k) {
		if(head==null){
			return head;
		}
		ListNode tail=head;
		int len=1;
		ArrayList<ListNode> list=new ArrayList<>();
		while(tail.next!=null){
			list.add(tail);
			tail=tail.next;
			len++;
		}
		list.add(tail);
		tail.next=head;
		k=k%len;
		k=len-k-1;
		System.out.println("k="+k);
		tail=list.get(k);
		head=tail.next;
		tail.next=null;
		return head;
	}