翻转部分单向链表

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值