【链表】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等于链表长度的整数倍时,相当于链表又还原到原来的状态。

设链表长度为n,k = k % n, 则题目的意思是相当于把链表的后k个节点放到链表头部,因此我们只需要找到链表的倒数第k个节点,然后让尾节点指向头结点,倒数第k+1个节点的next指向NULL。当然要注意边界条件,例如k刚好是链表长度的整数倍。

对于找到链表的倒数第k个节点,可以用双直针的方法,第一个指针先指向第k个节点,第二个指针指向头结点,然后两个节点一起前进,当第一指针指向尾节点时,第二个指针就指向倒数第k个节点。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var rotateRight = function(head, k) {
    if(head==null||head.next==null||k==0){
        return head;
    }
    
    var r=head,l=head,l_pre=null;
    var p=head,len=1;
    while(p.next!=null){
        p=p.next;
        len++;
    }
    k=k%len;
    if(k==0){
        return head;
    }
    for(var i=1;i<k;i++){
        r=r.next;
        if(r==null){
            r=head;
        }
    }
    
    while(r.next){
        r=r.next;
        l_pre=l;
        l=l.next;
    }
    
    if(l_pre==null){
        return head;
    }
    r.next=head;
    l_pre.next=null;
    return l;
    
};

 

posted @ 2016-01-19 21:40  很好玩  阅读(397)  评论(0编辑  收藏  举报