zoukankan      html  css  js  c++  java
  • 【链表】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;
        
    };
  • 相关阅读:
    docker制作容器(待更新)
    docker 容器连接宿主机mysql问题
    发布linux应用程序(待更新)
    docker 常用命令 (日常更新)
    多线程还是多进程的选择及区别(转)
    关于C++ const 的全面总结《转》
    JS闭包详解
    JS基础——js动画
    JS基础——innerHTML、CSS-DOM
    JS基础——DOM(一)
  • 原文地址:https://www.cnblogs.com/shytong/p/5143497.html
Copyright © 2011-2022 走看看