链表操作二——合并,逆转

链表的基本操作合并,逆转:

一:两个有序链表的合并(顺序从小到大依次排列)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <time.h>
  5
  6 typedef struct tag
  7 {
  8     int Nnum_;
  9     struct tag *Nnext_;
 10 }Node, *pNode;
 11
 12
 13 void link_print(pNode phead)
 14 {
 15     while(phead != NULL)
 16     {
 17         printf("%4d", phead->Nnum_);
 18         phead = phead->Nnext_;
 19     }
 20     printf("\n");
 21 }
 22
 23
 24 void link_insert_by_sort(pNode *phead, int size)
 25 {
 26     pNode pNew = NULL;
 27     pNode pCur, pPre;
 28
 29     while( size > 0 )
 30     {
 31         pNew = (pNode)malloc(sizeof(Node));
 32         pNew->Nnum_ = rand()%1000;
 33
 34         pPre = NULL;
 35         pCur = *phead;
 36         while( pCur != NULL)
 37         {
 38             if( pNew->Nnum_ > pCur->Nnum_) //按照从小到大排序
 39             {
 40                 pPre = pCur;
 41                 pCur = pCur->Nnext_;
 42             }
 43             else //找到位置
 44                 break;
 45         }
 46         //找到的位置在头部
 47         if( pPre == NULL)
 48         {
 49             pNew->Nnext_ = *phead;
 50             *phead = pNew;
 51         }else//位置在中间或者尾部
 52         {
 53             pPre->Nnext_ = pNew;
 54             pNew->Nnext_ = pCur;
 55         }
 56         size --;
 57     }
 58 }
 59
 60 void link_merge(pNode *pLeft, pNode *pRight)//采用尾插法
 61 {
 62     pNode pLeft_cur = *pLeft, pLeft_tail;
 63     *pLeft = NULL; //置空
 64     pLeft_tail = NULL;
 65
 66     pNode pRight_cur = *pRight;
 67
 68     while( pLeft_cur != NULL && pRight_cur!= NULL)
 69     {
 70         if( pLeft_cur->Nnum_ < pRight_cur->Nnum_) //如果左链表元素值小于右链表元素值
 71         {
 72             if( *pLeft == NULL)//目前为空
 73             {
 74                 *pLeft= pLeft_cur; //赋值
 75                 pLeft_tail = pLeft_cur;//增加个名字
 76                 pLeft_cur = pLeft_cur->Nnext_;//向前移动
 77             }else //已经存在
 78             {
 79                 pLeft_tail->Nnext_ = pLeft_cur; //连接
 80                 pLeft_tail = pLeft_cur;
 81                 pLeft_cur = pLeft_cur->Nnext_;
 82             }
 83         }
 84         else//如果左链表元素值大于或者等于右链表元素值
 85         {
 86             if( *pLeft == NULL)//目前为空
 87             {
 88                 *pLeft= pRight_cur;//赋值
 89                 pLeft_tail = pRight_cur;
 90                 pRight_cur =  pRight_cur->Nnext_;
 91             }
 92             else//非空
 93             {
 94                 pLeft_tail->Nnext_ = pRight_cur;//连接
 95                 pLeft_tail = pRight_cur;
 96                 pRight_cur =  pRight_cur->Nnext_;
 97             }
 98         }
 99     }
100     if( pLeft_cur ==NULL) //连接右链表剩余的元素
101         pLeft_tail->Nnext_ = pRight_cur;
102
103     if( pRight_cur == NULL)//连接左链表剩余的元素
104         pLeft_tail->Nnext_ = pLeft_cur;
105 }
106
107 int main(int argc, char const *argv[])
108 {
109     srand(time(NULL));
110     pNode phead = NULL;
111     link_insert_by_sort(&phead,10);
112     link_print(phead);
113
114     pNode poher = NULL;
115     link_insert_by_sort(&poher,12);
116     link_print(poher);
117
118     link_merge(&phead, &poher);
119     link_print(poher);
120     return 0;
121 }

时间: 2024-11-14 20:17:55

链表操作二——合并,逆转的相关文章

递归逆转链表和递归合并有序链表的代码

#include <stdio.h> struct node { int val; struct node *pNext; }; struct node *gen() { struct node *pHead = NULL; for(int i = 10; i > 0; i--){ struct node * p = malloc(sizeof(struct node)); p -> val = i; p -> pNext = pHead; pHead = p; } retu

[LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 这道题是要求把有序链表转为二叉搜索树,和之前那道Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树思路完全一样,只不过是操作的数据类型有所差别,一个是数组,一个是链表.数组方便就方便在可以通过index直接访问任意一个元

链表(二)——单向链表的基本操作(创建、删除、打印、结点个数统计)

1.指针的联动 通过两个指针分别指向前驱和后继结点,并在单向链表上进行移动,当指针指向待处理的结点时,该结点的前驱也有指针指向. 2.设有一个无序单向链表,且数据域的值均不相同,使指针pmin指向最小值结点,并使指针prem指向最小值结点的前驱结点: 代码片段: for(p = head; p; q = p, p = p->next) { if(pmin->data > p->data) { pmin = p; prem = q; } } 3.单向链表的删除算法 注:使用mallo

链表操作 -- 问题总结贴

本文同时收集了好友 sosohu 和 zhuoyuan 的文章,共同进步.欢迎指正. 链表结构的实现: -- zhouyuan 单链表操作: (1). 倒序访问 --  sosohu (2). 获取链表的倒数第K个元素 -- sosohu    zhouyuan carlsama (3). 查找链表的中间节点 -- sosohu  carlsama (4). 链表反转 -- sosohu zhuoyuan carlsama (5). 链表中节点的删除 -- sosohu  carlsama (6

10、单链表操作

单链表操作 单链表操作1 /*单链表的类型定义*/ typedef int DataType; typedef struct node { DataType data; struct node * next; }LinkNode, *LinkList; /*单链表的定位运算*/ LinkNode *Locate(LinkNode *L, int k)//????为什么此处是LinkNode *Locate()类型,表示什么意思 { LinkNode *p; int i; i= 1; p = L-

JAVA 链表操作:循环链表

主要分析示例: 一.单链表循环链表 二.双链表循环链表 其中单链表节点和双链表节点类和接口ICommOperate<T>与上篇一致,这里不在赘述.参考:JAVA链表操作:单链表和双链表http://www.cnblogs.com/xiaoxing/p/5969133.html 一.单链表循环链表 package LinkListTest; import java.util.HashMap; import java.util.Map; public class SingleCycleLinkLi

关于leetcode中链表操作的的几道题。

1.Remove Nth Node From End of List 第一道题就是经典的只扫描一遍链表就删除倒数第n个节点的链表操作. 思路就是,用两个指针,第一个指针先走n步,然后第二个指针开始,当第一个指针走到最后,那么第二个指针会走到倒数第n+1个点. 但是这里有几个边界需要考虑: 第一个就是,可能删除的是第一个节点,即"正数第一个",这个时候需要判断,判断的方法是第一个指针已经为空了. 当然,OJ上没有处理的是,可能删除的倒数第n个点超过了链表总的长度,或者n是负值等. /*-

C/C++链表操作(面试)

1.为了反转这个单链表,我们先让头结点的next域指向结点2,再让结点1的next域指向结点3,最后将结点2的next域指向结点1,就完成了第一次交换,顺序就变成了Header-结点2-结点1-结点3-结点4-NULL,然后进行相同的交换将结点3移动到结点2的前面,然后再将结点4移动到结点3的前面就完成了反转,思路有了,就该写代码了: 1 LinkedList ReverseSinglyLinkedList(LinkedList list) 2 { 3 LNode *tmp = NULL; 4

[原创] 算法之递归(3)- 链表操作

算法之递归(3)- 链表操作 递归(2)尝试了一个单链表的遍历,同时又分析了如何添加自己的操作,是在递归调用之前,还是在递归调用之后. 今天,打算将问题深入一下,即添加相应的操作在递归的过程中. (免责声明:下面的解法纯属娱乐 ,另外,示例代码未经编译和调试,许多想法未经实践验证.) 查找链表当中倒数第N个节点. 解法一 逐层递归,遍历到最后一个节点,并从返回的节点一次向后递归,遍历N次,找到倒数第N个节点. private LNode targetNode = null; private LN