翻转链表

91 阅读1分钟

LeetCode 25

原题链接

题解

LeetCode 25题解

图片出自

代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 * 
 * 模拟
 * 
 * 设置dummy节点,在头结点之前,模拟题意,进行k的倍数循环下去
 * 将每次循环得到的子链进行翻转
 * 
 * Code by java
 */

class Solution {
	public ListNode reverseKGroup(ListNode head, int k) {
	    ListNode dummy = new ListNode(0);		//创建一个节点dummy设置在头结点之前
	    dummy.next = head;

	    ListNode pre = dummy;					//pre,end 指针从dummy出发
	    ListNode end = dummy;

	    while (end.next != null) {
	        for (int i = 0; i < k && end != null; i++) {
	        	end = end.next;
	        }
	        if (end == null) break;				//下面的步骤用于翻转子数组,最后没有到k的一段链表提前break,不翻转
	        
	        ListNode start = pre.next;			//start从pre指针的下一位开始,定为子链表的开头
	        ListNode next = end.next;			//next是end(子链表的结尾)的下一位,用于确定下一个子链表的开头
	        
	        end.next = null;					//断链,让子链表独立出来,方便调用reverse方法
	        pre.next = reverse(start);			//传入以start开头end结尾的链表,进行翻转,然后将新子链表与开头pre链接
	        start.next = next;					//翻转后,start变成子链表的结尾,重新与后面的next链表连接
	        pre = start;						//重新设置新的pre(dummy)和end
	        end = pre;
	    }
	    return dummy.next;						//返回链表,即dummy的下一位为头结点的链表
	}
	//翻转数组
	/*
	 * cur,head		  next              
	 * 	   1    ->     2      ->    3     ->   null  
	 *    cur           pre
	 *     1    ->     null
	 * cur,pre    
	 *     1    ->     null
	 *    cur           pre
	 *     2    ->       1    ->    null
	 */
	private ListNode reverse(ListNode head) {		
	    ListNode pre = null;
	    ListNode curr = head;
	    while (curr != null) {
	        ListNode next = curr.next;
	        curr.next = pre;
	        pre = curr;
	        curr = next;
	    }
	    return pre;
	}
}