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;
        
    };
  • 相关阅读:
    linux下删除乱码文件
    linux修改网卡延时、带宽、丢包等
    连接远程系统里的vbox虚拟机
    Linux路由功能
    关于C语言的取整函数
    新博客
    NEU1217之神风堂最少人数 自己在精度上吃了苦头
    sprintf sscanf自己应该会的小点
    【转】妙解亲和数
    redeclared as different kind of symbol
  • 原文地址:https://www.cnblogs.com/shytong/p/5143497.html
Copyright © 2011-2022 走看看