算法总结之 按照左右半区的方式重新组合单链表

把链表右边的 拿过来以此插入到左边的链表

思路:

如果链表长度为N,直接给出时间复杂度为O(N) 额外空间复杂度为O(1)的方法

1 如果链表为空,或者长度为1 不调整

2 链表长度大于1时, 遍历一便找到左半区最后一个节点 记为mid

package TT;

public class Test115 {

    public class Node{
    	public int value;
    	public Node next;

    	public Node(int data){
    		this.value=data;
    	}

    }	

   public void relocate(Node head){

	   if(head==null || head.next==null){

		   return;

	   }
	   Node mid = head;
	   Node right = head.next;
	   while(right.next!=null && right.next.next !=null){
		   mid=mid.next;
		   right=right.next.next;
	   }
	   right=mid.next;
	   mid.next=null;
	   mergeLR(head, right);
   }

   public void mergeLR(Node left, Node right){
	   Node next = null;
	   while(left.next!=null){
		   next=right.next;
		   right.next=left.next;
		   left.next=right;
		   left=right.next;
		   right=next;
	   }
	   left.next=right;
   }

}

  

时间: 2024-12-17 17:29:11

算法总结之 按照左右半区的方式重新组合单链表的相关文章

[程序员代码面试指南]链表问题-按照左右半区的方式重新组合单链表

题意 把链表分成左右半区,奇数个节点则右半区长一点,重新交叉排列成链表,如下例: 1,2,3,4,5,# =>1,3,2,4,5,# 1,2,3,4,#=>1,3,2,4,# 题解 找到分割点,拆开再合并. 代码 public class Main { public static void main(String args[]) { //test Node n1=new Node(1); Node n2=new Node(2); Node n3=new Node(3); Node n4=new

[算法浅析] 如何在O(1)的时间里删除单链表的结点

题目是这样的:给你一个单链表的表头,再给你其中某个结点的指针,要你删除这个结点,条件是你的程序必须在O(1)的时间内完成删除. 由于有的同学对链表还不是很熟悉,本文尽量描述的通俗易懂,老鸟请直接跳过前面一大段. 链表结构如下: struct node { int val; node* next; }; 题目不是很难,很快就能想到好办法:) 首先回顾一下普通的删除方法,首先通过表头,找到待删除结点(设为B)的前一个结点(设为A),将A的指向改一下就行,然后删除掉B结点就行了.要删除的结点一定要de

【LeetCode-面试算法经典-Java实现】【061-Rotate List(旋转单链表)】

[061-Rotate List(旋转单链表)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL. 题目大

【LeetCode-面试算法经典-Java实现】【086-Partition List(将单链表进行分区)】

[086-Partition List(将单链表进行分区)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the

排序算法----基数排序(RadixSort(L,max))单链表版本

转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.在每一次排序中,按照当前位把数组元素放到对应 的桶当中,然后把桶0到桶9中的元素按先进先出的方式放回数组中.这样从最低位排序一直到最高位排序完成以后,

韩顺平_PHP程序员玩转算法公开课(第一季)02_单链表在内存中存在形式剖析_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/链表——最灵活的数据结构链表用来解决复杂的问题和算法是很方便的. 内容介绍1.什么是链表2.单向链表3.双向链表4.环形链表5.使用环形链表解决约瑟夫问题 链表——什么是链表链表是有序的列表,但是它在内存中是分散存储的. 链表无处不在,比如在操作系统中,文件和文件之间,文件块和文件块之间,是靠链表链接起来的.使用链表可以解决类似约瑟夫问题,排序,索引,二叉树,广义表... 链表——单链表的快速入门使用head头的单向链表

iOS 单链表算法的一些问题

链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域. 相比于线性表顺序结构,操作复杂.由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn

4.2.2 算法之美--单链表实现

按照书上的要求实现了一下单链表:单链表的实现可能以前看过几次了:现在想想最主要的几个操作算法应该能够写了吧:遇到的问题: 1. 链表节点写成private;所已给出了访问的接口: 2.模板类的.h和.cpp实现写在同一个文件: 3.感觉以后的数据结构实现还是用纯c的实现好一些:然后书主要是思路 节点类: #ifndef SINGLELIST_LISTNODE_H_ #define SINGLELIST_LISTNODE_H_ template <class T> class ListNode

单链表倒置算法

LinkList reverse(LinkList L)//单链表的倒置算法 { LNode *p,*q; p=L->next; L->next=NULL; while(p) { q=p; p=p->next; q->next=L->next; L->next=q; } return L; }