详谈单链表之合并and冒泡排序

<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong>  线性表一章基本看完了,但是感觉还学得太少,应该和一些经典的算法相结合,看看自己应用的如何。不得不承认自己只是做简单的实现,并没有对代码进行太多的优化。。。希望各位大神莫怪~~废话少说,代码搞起。。</strong></span>
<strong><span style="font-family:KaiTi_GB2312;font-size:18px;">//有序链表的合并
class MergerSingleList {
 private Nod head;

 public Nod getHead() {
  return head;
 }
 public void setHead(Nod head) {
  this.head = head;
 }
 public Nod getTail() {
  return tail;
 }
 public void setTail(Nod tail) {
  this.tail = tail;
 }
 // 查找指定位置的结点
 public Nod FindKth(int k) {
  Nod temp = head;
  int i = 1;
  while (temp != null && i < k) { // 移动元素,直到找到相应位置
   temp = temp.next;
   i++;
  }
  if (i == k)
   return temp;
  else
   return null;
 }
 // 将结点插入指定位置
 public void insert(int index, int a) {
  Nod newNode = new Nod(a);
  if (index > Length + 1) {
   System.out.println("超出范围,无法插入");
  } else {
   if (index == 1) {
    newNode.next = head;
    head = newNode;
    Length++;
   } else if (index > 1 && index < 100) {
    newNode.next = FindKth(index - 1).next;
    FindKth(index - 1).next = newNode;
    Length++;
   }
  }
 }
 // 打印链表
 public void display() {
  Nod current = head;
  while (current != null) {
   current.displayNod();
   current = current.next;
  }
 }
 // Sort
 public void BubbleSort(MergerSingleList m1) {
  Nod current1 = null;
  Nod current2 = null;
  int temp = 0;
  for (int k = m1.Length - 1; k > 0; k--) {
   for (int i = 1; i < k + 1; i++) {
    if (i <= m1.Length) {
     current1 = m1.FindKth(i);
     current2 = m1.FindKth(i + 1);
     if (current1.key > current2.key) {
      temp = current1.key;
      current1.key = current2.key;
      current2.key = temp;
     }
    }
   }
  }
  m1.display();
 }
 public static void main(String args[]) {
  MergerSingleList ms1 = new MergerSingleList();
  MergerSingleList ms2 = new MergerSingleList();
  // 在单链表1中插入元素
  ms1.insert(1, 1);
  ms1.insert(2, 2);
  ms1.insert(3, 3);
  ms1.insert(4, 8);
  ms1.insert(5, 9);
  // 在单链表2中插入元素
  ms2.insert(1, 4);
  ms2.insert(2, 5);
  ms2.insert(3, 6);
  ms2.insert(4, 7);
  ms2.insert(5, 7);
  // 打印单链表1、2
  System.out.println("单链表1");
  ms1.display();
  System.out.println();
  System.out.println("单链表2");
  ms2.display();
  System.out.println();
  /** ************************方法1************************** */
  // ms1.FindKth(ms1.Length).next = ms2.head;
  // System.out.println("单链表合并后为:");
  // ms1.display();
  /** ************************方法2************************** */
  // 建立单链表3,存放单链表1、2的元素
  MergerSingleList ms3 = new MergerSingleList();
  for (int i = 0; i <= (ms1.Length + ms2.Length); i++) {
   ms3.insert(i, 0);
  }
  System.out.println("单链表3");
  ms3.display();
  System.out.println();
  ms3 = ms1;
  System.out.println("将单链表1存放到单链表3后");
  ms3.display();
  System.out.println();
  for (int j = 1; j <= ms2.Length; j++) {
   int a = ms2.FindKth(j).key;
   ms3.insert(ms1.Length + 1, a);
  }
  System.out.println("合并的链表");
  ms3.display();
  System.out.println();
  System.out.println("排序后的链表");
  ms3.BubbleSort(ms3);
 }
}
class Nod {
 public int key;
 public Nod next;
 // 初始化头结点
 public Nod(int head) {
  this.key = head;
  this.next = null;
 }
 public void displayNod() {
  System.out.print(key + " -> ");
 }
}
</span></strong>

时间: 2024-08-09 16:54:43

详谈单链表之合并and冒泡排序的相关文章

合并两个有序的单链表,合并之后的链表依然有序【出现频率高】

合并两个有序的单链表,合并之后的链表依然有序: 这道题经常被各公司考察. 例如: 链表1:   1->2->3->4 链表2:   2->3->4->5 合并后:   1->2->2->3->3->4->4->5 解题思路:   挨着比较链表1和链表2.   这个类似于归并排序.尤其要注意两个链表都为空.和其中一个为空的情况.只需要O (1) 的空间.时间复杂度为O (max(len1,len2)) public Node me

单链表的合并(递归、非递归)

递归方法将两个链表合并成一个链表 例:已知两个单链表head1和head2各自有序升序排列,请把他们合并成一个连表并依然有序,并保留原来所有节点 假设以下两个链表: 链表1:1->3->5 链表2:2->4->6 (1)比较1和链表2的第一个节点数据,由于1<2,因此把结果链表头结点指向链表1中的第一个节点,即数据1所在的节点 (2)对剩余的链表1(3->5)和链表2在调用本过程,比较得到结果链表的第二个节点,即2与3比较得到2,此时合并后的链表节点为1->2,这

两个有序单链表的合并

已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序这个类似归并排序.尤其注意两个链表都为空,和其中一个为空时的情况.只需要O(1)的空间.时间复杂度为O(max(len1, len2)) 1 public static Node mergeSortedList(Node head1, Node head2) { 2 // 其中一个链表为空的情况,直接返回另一个链表头,O(1) 3 if (head1 == null) { 4 return head2; 5 } 6

笔试,面试,C/C++,数据结构单链表排序(改进冒泡排序)

void BubbleSortNode(SListNode *&pHead)//单链表排序 {  assert(pHead);  SListNode *tail = NULL;  int Bool = 0;  //若没有进行交换提前返回  while (tail!=pHead->next)  {   Bool = 0;   SListNode *tmp = pHead;   SListNode *tmpnext = tmp->next;   while (tmp->next !=

两个单链表的合并,并排序

/*先看看单链表的知识很快就能做出来 这个用三个结构体指针,两个p1,p2指向建立的链表,一个p3指向新的链表判断判断p1p2指向的数据那个小,小的赋值给p3->next(升序),小的那个p1(p2)下移一个赋值顺序要搞对,要不然指向有误 */ #include<stdlib.h>#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node *next;}lnode,*l

详谈单链表的有关操作集锦~

1.单链表    在 Java 中没有显式的指针类型,然而实际上对象的访问就是使用指针来实现的,即在Java 中是使用对象的引用来替代指针的.因此在使用 Java 实现该结点结构时,一个结点本身就是一个对象.结点的数据域 data 可以使用一个 Object 类型的对象来实现,用于存储任何类型的数据元素,并通过对象的引用指向该元素:而指针域 next 可以通过节点对象的引 用来实现.      单链表结点结构是结点的一种最简单的形式,除此之外还有其他不同的结点结构,但是这些结点结构都有一个数据域

单链表的合并

要求:讲两个有序链表合并成一个有序链表,结果链表仍使用原来两个链表的存储空间,不占用其他存储空间,表中允许有重复的数据. 算法:(1)指针pa和pb初始化,分别指向连个链表La和Lb的第一个节点   (2)Lc的结点取值为La的头结点   (3)指针pc初始化,指向Lc的头结点   (4)当指针Pa和Pb均未达到相应表尾时,则依次比较pa和pb所指向元素大小,从La或Lb中取出较小的结点插入到c的最后    (5)将非空表的剩余段插入到pc所指结点之后,并释放Lb的头结点 如图:这是算法1-3步

俩个递增有序单链表的合并算法(含头结点)

void  merge(LNode *A,LNode *B,LNode *&C)    //此处C指针为引用型 { LNode *p=A->next; LNode  *q=B->next; LNode  *r;     //r是尾指针 C=A; C->next=NULL; r=C; free(B);       //释放B的头结点 While(p!=NULL&&q!=NULL) { if(p->data<=q->data) { r->nex

Leetcode23---&gt;Merge K sorted Lists(合并k个排序的单链表)

题目: 合并k个排序将k个已排序的链表合并为一个排好序的链表,并分析其时间复杂度 . 解题思路: 类似于归并排序的思想,lists中存放的是多个单链表,将lists的头和尾两个链表合并,放在头,头向后移动,尾向前移动,继续合并,直到头和尾相等,此时已经归并了一半, 然后以同样的方法又重新开始归并剩下的一半.时间复杂度是O(logn),合并两个链表的时间复杂度是O(n),则总的时间复杂度大概是O(nlogn):合并两个单链表算法可以参考Leetcode21中的解法:http://www.cnblo