【leecode】92. 反转链表 II

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

思路将单链表进行反转,头变尾,尾变头,改变指针。但是这个题,需要进行指针边界的判定。

  • (1) 先判断反转开始的位置
  • (2) 反转链
  • (3) 将链通过指针恢复完整
  • 注意:链的指针的判断,因为可能会被修改。
public class 指定位置反转链表 {
	public static class ListNode{
		public int val;
		public ListNode next;
		
		public ListNode(int val) {
			this.val = val;
		}
	}
	//1 ≤ m ≤ n ≤ 链表长度
	public static ListNode reverseBetween(ListNode head, int m, int n) {
		//特殊条件的判定,节省计算
		if(head == null || head.next == null || m == n) {
			return head;
		}
		
		int count = 1;
		ListNode hd = head; //临时指针
		ListNode lp = null; //分割链的左侧指针
		ListNode rp = null; //分割链的右侧指针
		ListNode pre = null; //旋转链的开始
		ListNode next = null; 
		//找到lp   如果m = 1, 跳过这个循环
		while(count < m){
			lp = hd;
			hd = hd.next;
			count++;
		}
		
		rp = hd;
		//生成反转链
		while(count <= n) {
			next = hd.next;
			hd.next = pre;
			pre = hd;
			hd = next;
			count++;
		}
		
		//恢复完整的链 如果m=1,链指针被修改
		if(m != 1) {
			lp.next = pre;
		} else {
			head = pre;
		}
		rp.next = hd;
		return head;
	}
	
	public static void printLinkedList(ListNode head) {
		while(head != null) {
			System.out.print(head.val + " ");
			head = head.next;
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		ListNode head = new ListNode(1);
		head.next = new ListNode(2);
		head.next.next = new ListNode(3);
		head.next.next.next = new ListNode(4);
		head.next.next.next.next = new ListNode(5);
		printLinkedList(head);
		printLinkedList(reverseBetween(head, 3,5));
	}
}

 

你可能感兴趣的:(数据结构)