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;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值