反转列表的倒数N位

前两天面试字节,出了一道算法题,当时时间原因加上紧张,没做出来,后来准备别的面试就方了,这两天闲了给写出来了,本想传至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)+"】");
}

结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值