题目:给定一个头结点head,以及两个整数from,to,在单链表上翻转第from个到第to个节点
思路:可能存在换头的状态,例如1->2->3, from=1,to= 3,最后头结点会变,为3->2->1。所以要提前判断一下有没有换头的情况发生,即from,to与链表首尾长度的关系。 接下来要找到from-1,与to+1个节点。其实如果from-1==null就说明了会出现换头的现象
总结:要判断pre是否为空,并且将pre初始化,可以再一次遍历中就顺便一起统计了,就相当于一个计数,当计数到from-1时,进行初始化,没有的话就返回null
public class text {
public Node reverse(Node head,int from,int to) {
int len = 0;
Node node1 = null;
Node pre = null;
Node last = null;
while(node1!=null){
len++;
pre = len==from-1?node1:pre; //如果在len++的过程中,找到了from前一个,那就将pre定为此时累加到的这个节点
last = len==to+1?node1:last; //同理,如果在len++过程中找到了to后面的一个,就赋值为当前点,否则均为null
node1 = node1.next;
}
if(from>to||from<1||to>len) {
return head;
}
node1 = pre==null?head:pre.next; //看是否需要换头,如果pre==null的时候,头结点要换了,就是从原头开始换
Node node2 = node1.next;
node1.next = last; //将原来的头连至to+1
Node next = null;
while(node2!=last) { //下一位依次指向前
next = node2.next;
node2.next = node1;
node1 = node2;
node2 = next;
}
if(pre!=null) { //如果pre存在的时候,接到pre(from-1)后面
pre.next = node1;
return head;
}
return node1; //否则不用拼接,直接是倒转之后的新头结点
}
}