從M到N的位置開始反轉鏈表

 

package com.list;

public class LGNode {
  private Integer val;
  private LGNode next;

  public LGNode() {

  }

  public LGNode(Integer val) {
    this.val = val;
    this.next = null;
  }

  public Integer getVal() {
    return val;
  }

  public void setVal(Integer val) {
    this.val = val;
  }

  public LGNode getNext() {
    return next;
  }

  public void setNext(LGNode next) {
    this.next = next;
  }

  @Override
  public String toString() {
    return "LGNode [val=" + val + ", next=" + next + "]";
  }
  
}
package com.list;

public class LGLinkListII {
  public static void main(String[] args) {
    LGNode head = new LGNode(1);
    LGNode node1 = new LGNode(2);
    LGNode node2 = new LGNode(3);
    LGNode node3 = new LGNode(4);
    LGNode tail = new LGNode(5);
    head.setNext(node1);
    node1.setNext(node2);
    node2.setNext(node3);
    node3.setNext(tail);
    
    LGNode newHead = reverseMToN(head,2,4);
    StringBuilder sb = new StringBuilder();
    while(newHead != null) {
      sb.append(newHead.getVal());
      newHead = newHead.getNext();
      if(newHead != null) {
          sb.append(" -> ");
      }
    }
    System.out.println(sb.toString());
  }
  //假設m與n都是正常的情況,不越界,設定M爲2,N爲4
  public static LGNode reverseMToN(LGNode head,Integer m,Integer n) {
    if(head == null || m >= n) {
       return head;
    }
    //定義一個dummy節點,
    LGNode dummy = new LGNode(-1);
    dummy.setNext(head);
    head = dummy;

    // -1 ->   1 -> 2 -> 3 -> 4 -> 5
    // dummy
    // head   preM  M         N   PostN
    // 最終的preM指向N,M指向PostN
    for(Integer index = 1 ;index < m; index ++) {
       head = head.getNext();
    }
    //執行後的結果爲
    // -1 ->   1 -> 2 -> 3 -> 4 -> 5
    // dummy
    //        head  
    LGNode preM = head;
    LGNode mNode = head.getNext();
    LGNode nNode = mNode;
    LGNode postN = nNode.getNext();
    for(Integer index = m;index < n;index++){
        // -1 ->   1 ->      2       ->  3   ->   4 -> 5
        //(1)    preM   (mNode,nNode) postN
        //(2)    preM     (mNode)     nNode      postN
        LGNode nextNode = postN.getNext();
        postN.setNext(nNode);
        nNode = postN;
        postN = nextNode;
    }
    mNode.setNext(postN);
    preM.setNext(nNode);
    return dummy.getNext();
 }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章