61. Rotate List

一、题目

  1、审题

  

  2、分析

    给出一个链表,一个参数 k,将链表的后边 k 个节点移动到左边来。(其中 k 可能大于链表长度)

 

二、解答

  1、思路:

    ①、获得链表长度 total ,同时记录末尾节点 endNode。则 k = k % total 即为需要移动的后边部分的节点数,则 leftStep = total - k 即为前边不需要动的节点数。

    ②、将原链表第 leftStep+1 个节点成为新链表的头结点,即 第 leftStep.next = null;

    ③、原末尾节点 endNode 拼接到原来的头结点。

public ListNode rotateRight(ListNode head, int k) {
        
        if(head == null || head.next == null || k == 0)    // 不需要移动
            return head;
        
        int total = 1;
        ListNode endNode = head;    
        while(endNode.next != null) {
            total++;
            endNode = endNode.next;    // 记录末尾一个节点
        }
        
        k = k % total;
        if(k == 0)        // 不需要移动
            return head;
        
        int leftStep = total - k;
        ListNode tmpNode = head; 
        for(int i = 1; i < leftStep; i++) 
            tmpNode = tmpNode.next;
        ListNode newHead = tmpNode.next;  
        tmpNode.next = null; // 新的末尾节点
        endNode.next = head;    // 拼接 
        
        return newHead;
    }

 

      

 

posted @ 2018-09-19 17:43  skillking2  阅读(158)  评论(0编辑  收藏  举报