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