码迷,mamicode.com
首页 > 其他好文 > 详细

Jan 19 - Rotate List; Linked List; Two Pointers; Iteration & Recursion;

时间:2016-01-20 07:36:05      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

Use 3 pointers each of them points to the address of Head, The node before Tail and Tail node; When rotating the list step by step, tail.next = head; tail_prev.next = null. New head = tail and new Tail = tail_prev;

Code: (Recursion way)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || head.next == null) return head;
        
        ListNode cur = head;
        int len = 0;
        while(cur != null && cur.next != null){
            cur = cur.next;
            len++;
        }
        if(cur != null) len++;
        k = k % len;
        if(k == 0) return head;
        ListNode tail = cur;
        ListNode newHead = rotateOneStep(head, tail, k);
        return newHead;
    }
    
    public ListNode rotateOneStep(ListNode head, ListNode tail, int num){
        ListNode tail_prev = head;
        while(tail_prev != null && tail_prev.next.next != null) tail_prev = tail_prev.next;
        tail.next = head;
        tail_prev.next = null;
        if(num == 1) return tail;
        head = tail;
        tail = tail_prev;
        return rotateOneStep(head, tail, num-1);
    }
}

  

Code(Iteration way):

public class Solution {
    //ListNode newHead, newTail;
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || head.next == null) return head;
        
        ListNode cur = head;
        int len = 0;
        while(cur != null && cur.next != null){
            cur = cur.next;
            len++;
        }
        if(cur != null) len++;
        k = k % len;
        ListNode tail = cur;
        for(int i = 0; i < k; i++){
            ListNode tail_prev = head;
            while(tail_prev != null && tail_prev.next.next != null) tail_prev = tail_prev.next;
            tail.next = head;
            tail_prev.next = null;
            head = tail;
            tail = tail_prev;
        }
        return head;
    }

  Code. Use List to store each node:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || head.next == null) return head;
        List<ListNode> findPrev = new ArrayList<>();
        ListNode cur = head;
        int len = 0;
        while(cur != null && cur.next != null){
            findPrev.add(cur);
            cur = cur.next;
            len++;
        }
        if(cur != null) {
            findPrev.add(cur);
            len++;
        }
        k = k % len;
        ListNode tail = cur;
        for(int i = 0; i < k; i++){
           
            ListNode tail_prev = findPrev.get(len-2);
            tail.next = head;
            tail_prev.next = null;
            head = tail;
            tail = tail_prev;
            findPrev.add(0, findPrev.remove(len-1));
        }
        return head;
       
    }
}

  

 

Jan 19 - Rotate List; Linked List; Two Pointers; Iteration & Recursion;

标签:

原文地址:http://www.cnblogs.com/5683yue/p/5143947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!