leecode牛客没有的字节面试算法题,难度中等,

一曲冷凌霜 提交于 2021-02-14 11:41:40

前两天面试字节,出了一道算法题,当时时间原因加上紧张,没做出来,后来准备别的面试就方了,这两天闲了给写出来了,本想传至leecode一起分享,好像传不上去:
题目是这样的,给定一个链表,将其后n位实现反转,若n>=链表长度,则将链表进行全部反转,处理好程序过程中出现的异常,保证时间空间复杂度;

废话不多说直接举例:

example 如下:
输入:1->2->3->4->5->6->end; 
当n=1时,输出 1->2->3->4->5->6->end; 

当n=2时,输出 1->2->3->4->6->5->end; 

当n=3时,输出 1->2->3->6->5->4->end; 

当n=10时,输出 6->5->4->3->2->1->end; 

链表是我自己定义的,童鞋们可以自己定义哈:

static class Node{
    public int i;

    public Node next;

    @Override
    public String toString() {
       String rst="";
       Node temp=this;
       while (temp!=null){
           rst+=temp.i+"->";
           temp=temp.next;
           if(temp==null){
               rst+="end";
           }
       }
       return rst;
    }

    public Node(int... is) {
        this.i=is[0];
        Node node=null;
        if(is.length>1){
            Node temp=null;
            for(int n=1;n<is.length;n++){
                if(temp==null){
                    node=new Node(is[n]);
                    temp=node;
                }else{
                    temp.next=new Node(is[n]);
                    temp=temp.next;
                }
            }
        }
        this.next=node;
    }
}

我的实现代码为:

public static Node reverseNode(Node node,int n){
    if(node==null||node.next==null|| n<=1){
        return node;
    }
    Node lastNode=node;
    for(int i=1;i<n ;i++){
        if(lastNode.next!=null){
            lastNode=lastNode.next;
        }else{
            break;
        }
    }

    Node startNode=node;Node startPreNode=null;
    for (;lastNode.next!=null;){
        startPreNode=startNode;
        startNode=startNode.next;
        lastNode=lastNode.next;
    }

    if(startPreNode!=null){
        startPreNode.next=lastNode;
    }else{
        node=null;
    }

    Node temp=startNode.next;
    Node pre=startNode;
    for(;temp!=lastNode;){
        startNode=temp;
        temp=startNode.next;
        startNode.next=pre;

        if(pre.next.next==pre){
            pre.next=null;
        }
        pre=startNode;
    }

    lastNode.next=startNode;
    if(lastNode.next.next==lastNode){
        startNode.next=null;
    }

    return node==null?lastNode:node;
}

测试:

public static void main(String[] args) {
    Node node=new Node(1,2,3,4,5,6,7,8,9,10);
    int n=2;
    System.out.println("输入:【"+node+"】,n="+n);
    System.out.println("输出:【"+reverseNode(node,n)+"】");

    n=0;
    node=new Node(1,2,3,4,5,6,7,8,9,10);
    System.out.println("输入:【"+node+"】,n="+n);
    System.out.println("输出:【"+reverseNode(node,n)+"】");

    n=5;
    node=new Node(1,2,3,4,5,6,7,8,9,10);
    System.out.println("输入:【"+node+"】,n="+n);
    System.out.println("输出:【"+reverseNode(node,n)+"】");

    n=20;
    node=new Node(1,2,3,4,5,6,7,8,9,10);
    System.out.println("输入:【"+node+"】,n="+n);
    System.out.println("输出:【"+reverseNode(node,n)+"】");

    n=20;
    node=new Node(1,2);
    System.out.println("输入:【"+node+"】,n="+n);
    System.out.println("输出:【"+reverseNode(node,n)+"】");

    n=1;
    node=new Node();
    System.out.println("输入:【"+node+"】,n="+n);
    System.out.println("输出:【"+reverseNode(node,n)+"】");
}

结果:

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!