25. K 个一组翻转链表(困难)

思路:

1)设置一个带头节点的指针hair,这个指针不动,用于最后返回链表

2)设置一个pre,一个end指针,都放在hair处,也就是第一个节点的前一个节点

pre用于每次翻转完记住起始位置,end用于往后遍历k个节点

3)每次遍历设置一个start指针,用于和end传入函数中进行翻转操作

代码:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
		ListNode hair=new ListNode(0);
		hair.next=head;
		
		ListNode pre=hair;
		ListNode end=hair;
		
		while(end.next!=null){
			for(int i=0;i<k&&end!=null;i++){
			end=end.next;
			}
			//以下条件不可忽略
			if(end==null) break;
			
			ListNode start=pre.next;
			ListNode next=end.next;
			
			//此处的目的是调用reverse函数时,使得start后面的节点只有2个(包括子函数)
			end.next=null;
			
			//翻转后的链表与原先的重新接上
			pre.next=reverse(start);
			
			start.next = next;
			pre = start;
			end = pre;
		}
		
		return hair.next;
		//以上一共声明了hair,pre,start,end,next五个指针
	}
	
	private ListNode reverse(ListNode start){
		ListNode pre=new ListNode(0);
		ListNode curr=start;
		
		//设置空指针让start=空指针
		while(curr!=null){
			ListNode next=curr.next;
			curr.next=pre;
			pre=curr;
			curr=next;
		}
		
		return pre;
	}
}

分解:

1)每次翻转完start和end指针都交换了位置

2)每次翻转完pre和end都放在start的位置(翻转后的start,相当于之前的end的位置)

3)翻转函数的代码分析

猜你喜欢

转载自blog.csdn.net/di_ko/article/details/115110466