leetcode25 Reverse Nodes in k-Group

原创 2015年11月18日 17:19:25

Reverse Nodes in k-Group

My Submissions
Total Accepted: 47206 Total Submissions: 181287 Difficulty: Hard

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


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public static ListNode reverse(ListNode p, int k) {
		ListNode pre = new ListNode(-1);
		ListNode px = p;
		ListNode q = px.next;
		for (int i = 0; i < k ; i++) {
			q = px.next;
			px.next = pre.next;
			pre.next = px;
			px = q;
		}
		return pre.next;
	}
    public ListNode reverseKGroup(ListNode head, int k) {
        if(head==null || head.next==null || k<1){
			return head;
		}
		ListNode pre = new ListNode(-1);
		ListNode startpre = pre;
	    ListNode p = head;
	    //ListNode prem = pre;
	    ListNode pm = p;
	   // boolean flag = false;
	    ListNode r = head;
	    int count = 0;
	    while(r!=null){
	    	r = r.next;
	    	count++;
	    }
	    if(count<k){
	    	return head;
	    }
	    while(true){
	    	int i;
	    	for( i=0;i<k && pm!=null;i++){
	    		//prem = pm;
	    		pm = pm.next;
	    	}
	    	/*if(pm==null && i<k &&flag == false){
	    		return head;
	    	}
	    	if(pm==null && i>=k && flag == false){
	    		ListNode x = reverse(p, k);
	    		pre.next = x;
	    	}*/
	    	if(i>=k ){
	    	//	flag = true;
	    		ListNode x = reverse(p, k);
	    		pre.next = x;
	    		/*pre = prem;*/
	    		for(int j=0;j<k;j++){
	    			pre = pre.next;
	    		}
	    		pre.next = pm;
	    		p = pm;
	    	}
	    	if(i<k){
	    		
	    		break;
	    	}
	    }
	    return startpre.next;
    }
}

可运行代码


package lianbiaofanzhuan;

public class Solution {
	public static ListNode create(int[] a) {
		ListNode head = new ListNode(a[0]);
		ListNode p = head;
		for (int i = 1; i < a.length; i++) {
			ListNode q = new ListNode(a[i]);
			p.next = q;
			p = q;
		}
		return head;
	}

	public static void display(ListNode head) {
		ListNode p = head;
		while (p != null) {
			System.out.println(p.val);
			p = p.next;
		}
	}

	public static ListNode reverse(ListNode head) {
		ListNode pre = new ListNode(-1);
		ListNode p = head;
		ListNode q;
		while (p != null) {
			q = p.next;
			p.next = pre.next;
			pre.next = p;
			p = q;
		}
		return pre.next;
	}

	public static ListNode reverse(ListNode p, int k) {
		ListNode pre = new ListNode(-1);
		ListNode px = p;
		ListNode q = px.next;
		for (int i = 0; i < k ; i++) {
			q = px.next;
			px.next = pre.next;
			pre.next = px;
			px = q;
		}
		return pre.next;
	}
	public static ListNode reverseKGroup(ListNode head, int k) {
		if(head==null || head.next==null || k<1){
			return head;
		}
		ListNode pre = new ListNode(-1);
		ListNode startpre = pre;
	    ListNode p = head;
	    //ListNode prem = pre;
	    ListNode pm = p;
	   // boolean flag = false;
	    ListNode r = head;
	    int count = 0;
	    while(r!=null){
	    	r = r.next;
	    	count++;
	    }
	    if(count<k){
	    	return head;
	    }
	    while(true){
	    	int i;
	    	for( i=0;i<k && pm!=null;i++){
	    		//prem = pm;
	    		pm = pm.next;
	    	}
	    	/*if(pm==null && i<k &&flag == false){
	    		return head;
	    	}
	    	if(pm==null && i>=k && flag == false){
	    		ListNode x = reverse(p, k);
	    		pre.next = x;
	    	}*/
	    	if(i>=k ){
	    	//	flag = true;
	    		ListNode x = reverse(p, k);
	    		pre.next = x;
	    		/*pre = prem;*/
	    		for(int j=0;j<k;j++){
	    			pre = pre.next;
	    		}
	    		pre.next = pm;
	    		p = pm;
	    	}
	    	if(i<k){
	    		
	    		break;
	    	}
	    }
	    return startpre.next;
    }
    
	public static void main(String[] args) {
		int[] a = { 1, 2};
		ListNode head = create(a);
		//display(head);
		/*ListNode headB = reverse(head);
		System.out.println();
		display(headB);*/
		
		
		ListNode headC = reverseKGroup(head, 3);
		display(headC);
	}

}

class ListNode {
	int val;
	ListNode next;

	ListNode(int x) {
		val = x;
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

每日算法之二十三:Reverse Nodes in k-Group

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
  • yapian8
  • yapian8
  • 2014年05月31日 11:18
  • 694

[leetcode]Reverse Nodes in k-Group 反转以k个节点为一组的链表

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
  • jhbxlx
  • jhbxlx
  • 2014年08月04日 07:22
  • 639

算法设计与分析(18)-- Reverse Nodes in k-Group(难度:Hard)

Reverse Nodes in k-Group
  • alexlau8
  • alexlau8
  • 2017年06月22日 21:09
  • 91

算法分析与设计课程(7):【leetcode】Reverse Nodes in k-Group

Description: Given a linked list, reverse the nodes of a linked list k at a time and return its...
  • lr787558718
  • lr787558718
  • 2017年04月07日 14:57
  • 76

C实现 LeetCode->Reverse Nodes in k-Group (双指针大法)(单链表反转)

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
  • liutianshx2012
  • liutianshx2012
  • 2015年06月22日 11:24
  • 416

leetcode:Reverse Nodes in k-Group(以k为循环节反转链表)【面试算法题】

题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified li...
  • zhang9801050
  • zhang9801050
  • 2013年12月02日 23:08
  • 1797

25. Reverse Nodes in k-Group 怎样不使用额外空间翻转一个单向链表?

Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
  • djgjmtdmjt
  • djgjmtdmjt
  • 2017年01月05日 12:20
  • 156

js中的join(),reverse()与 split()函数用法解析

js中的join(),reverse()与 split()函数用法解析及其拓展
  • u014593098
  • u014593098
  • 2014年09月08日 17:24
  • 8081

采用Hibernate Reverse Engineering工具遇到的问题及解决方法

我用的是MyEclipse6.0.1的开发工具,没有采用MyEclipse的Hibernate工具去自动生成实体类,而是手工自己编写hibernate的配置文件。 问题1: ...
  • zhifeng172
  • zhifeng172
  • 2013年02月22日 18:42
  • 1553

reverse_string(char *string)递归实现字符串翻转 和对“++”操作的一些分析

函数实现之前 先看一个例子 void fun(int i) { if (i > 0) fun(i / 2); printf("%d ",i); } int main(void) { fun...
  • Irean_Lau
  • Irean_Lau
  • 2015年03月12日 14:03
  • 1416
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode25 Reverse Nodes in k-Group
举报原因:
原因补充:

(最多只允许输入30个字)