前两天面试字节,出了一道算法题,当时时间原因加上紧张,没做出来,后来准备别的面试就方了,这两天闲了给写出来了,本想传至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)+"】"); }
结果:
来源:oschina
链接:https://my.oschina.net/u/4133389/blog/4952756