算法总结之 反转部分单向链表

给定单链表的表头节点head, 以及两个整数from 和 to, 在单向链表上把fro个节点到第to个节点这一部分进行反转

思路:

  本题 有可能存在换头的问题,所以函数应该返回调整后的新的头节点

  1 判断是否满足 1<=from<=to<=N 如果不满足,直接返回原来的头节点

  2 找到第from-1个节点pre和第to+1个节点tPos,fPre即要反转部分的前一个节点,tPos是反转部分的后一个节点,把反转部分先反转,然后正确的链接fPre和tPos

package TT;

import TT.Test85.Node;

public class Test90 {

    public Node reversePart(Node head, int from , int to){
        int len = 0;
        Node node1=head;
        Node fPre = null;
        Node tPos = nullwhile(node1!= null){ 
           len++;
           fPre = len == from-1 ? node1 : fPre;
           tPos = len== to+1 ? node1 : tPos;
           node1 =node1.next;
       }
        if(from<to || from<1 || to>len){
            return head;
        }
        node1 = fPre==null ? head:fPre.next;
        Node node2 = node1.next;
        node1.next = tPos;
        Node next = null;
        while(node2 !=tPos){
             next = node2.next;
             node2.next = node1;
             node1 = node2;
             node2 = next;
        }
        if(fPre != null){
            fPre.next=node1;
            return head;
        }
        return node1;
    }
    
    
    
}

 

posted @ 2017-09-09 21:39  toov5  阅读(280)  评论(0编辑  收藏  举报