Leetcode017--链表k个结点一组翻转

一、原题



  Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. 
  If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is. 
  You may not alter the values in the nodes, only nodes itself may be changed. 
  Only constant memory is allowed. 
  For example, 
  Given this linked list: 1->2->3->4->5 
  For k = 2, you should return: 2->1->4->3->5 
  For k = 3, you should return: 3->2->1->4->5 


一、中文


给定一个单链表,和一个分组数K,每K个结点进行反转,如果最后的结点数不足K个就保持原来的链接顺序不变。 



三、举例



1,3,5,7 当k=2的时候交换之后就是3,1,7,5了


四、思路



首先建立一个组链表的头结点,再建立一个组的尾结点用来存储组的尾,从组的尾结点出进行倒插,当插入到k个元素的时候进行,将组的头结点移动到组的尾结点处,依次往复。最后将最后的那几个元素再反转一次。


五、程序



package LeetCode;

class ListNodeKgroup {
    int val;
    ListNodeKgroup next;

    ListNodeKgroup() {}
    
    ListNodeKgroup(int x) {
        val = x;
        next = null;
    }
}

public class Leetcode018 {
	
	public static void main(String args[]){
		ListNodeKgroup n1 = new ListNodeKgroup(1);  
		ListNodeKgroup n2 = new ListNodeKgroup(2);  
		ListNodeKgroup n3 = new ListNodeKgroup(3);  
		ListNodeKgroup n4 = new ListNodeKgroup(4);  
		ListNodeKgroup n5 = new ListNodeKgroup(5); 
		ListNodeKgroup n6 = new ListNodeKgroup(6); 

        n1.next = n2;  
        n2.next = n3;  
        n3.next = n4; 
        n4.next = n5; 
        n5.next = n6; 
  
        
        ListNodeKgroup list = new ListNodeKgroup();
        list = reverseKGroup(n1, 3);
        
        while(list != null){
        	System.out.print(list.val+" ");
        	list = list.next;
        }
	}

	
    /**
     * 将两个有序链表进行合并
     * @param head
     * @param k
     * @return 调整后链表的头结点
     */
    public static ListNodeKgroup reverseKGroup(ListNodeKgroup head, int k){
    	//建立一个返回的结点
    	ListNodeKgroup root = new ListNodeKgroup(0);
    	
    	//建立一个组内的头结点
    	ListNodeKgroup groupHead = root;
    	
    	//建立一个组内的尾结点
    	ListNodeKgroup groupTail = head;
    	
    	//要处理的当前结点
    	ListNodeKgroup cur = head;
    	
    	//对于每个组处理了多少结点
    	int count = 0;
    	
    	while(cur != null){
    		//如果是这个分组的第一个元素就进行记录
    		if(count == 0){
    			groupTail = cur;
    		}
    		
    		count++;
    		
    		//用来记录下一个待处理的结点
    		ListNodeKgroup next = cur.next;
    		
    		//进行尾插的操作
    		cur.next = groupHead.next;
    		groupHead.next = cur;
    		cur = next;
    		
    		//如果已经处理完了k个结点
    		if(count == k){
    			//gruopHead指针进行移动,移动到我们在count=0的时候的groupTail结点
    			groupHead = groupTail;
    			count = 0;
    		}
    	}
    	
    	//如果count不等于0说明不是k的整倍数
    	if(count != 0){
    		cur = groupHead.next;
    		
    		//将最后几个从进行最后一次倒插就可以了
    		while(cur != null){
    			ListNodeKgroup next = cur.next;
        		cur.next = groupHead.next;
        		groupHead.next = cur;
        		cur = next;
    		}
    	}
    	
    	return root.next;
    }
}



已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页