翻转部分单向链表

题目:给定一个头结点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;     //否则不用拼接,直接是倒转之后的新头结点
	}  
}

点赞