using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LinkedListTest
{
class Program
{
static void Main(string[] args)
{ LinkList<int> linkA = new LinkList<int>();
linkA.Append(1);
linkA.Append(3);
linkA.Append(5);
linkA.Append(7);
linkA.Append(9); LinkList<int> linkB = new LinkList<int>();
linkB.Append(0);
linkB.Append(2);
linkB.Append(4);
linkB.Append(6);
linkB.Append(8);
//合并有序链表
Console.WriteLine("----------合并有序链表---------");
Node<int> nodeMerge= Merge(linkA.Head, linkB.Head);
LinkList<int> linkMerge = new LinkList<int>();
linkMerge.Head = nodeMerge;
linkMerge.Dispaly(); //链表反转
Console.WriteLine("----------链表反转---------");
linkMerge.Reverse();
Console.Read();
}
/// <summary>
/// 链表合并
/// </summary>
/// <param name="nodeA"></param>
/// <param name="nodeB"></param>
/// <returns></returns>
public static Node<int> Merge(Node<int> nodeA, Node<int> nodeB)
{
if (nodeA == null)
{
return nodeB;
}
else if (nodeB == null)
{
return nodeA;
} Node<int> newHead = null; if (nodeA.Data <= nodeB.Data)
{
newHead = nodeA;
newHead.Next = Merge(nodeA.Next, nodeB);
}
else
{
newHead = nodeB;
newHead.Next = Merge(nodeA, nodeB.Next);
} return newHead;
} }
public class LinkList<T>
{
public Node<T> Head { set; get; } //单链表头 //构造
public LinkList()
{
Clear();
} /// <summary>
/// 求单链表的长度
/// </summary>
/// <returns></returns>
public int GetLength()
{
Node<T> p = Head;
int length = 0;
while (p != null)
{
p = p.Next;
length++;
}
return length;
} /// <summary>
/// 判断单键表是否为空
/// </summary>
/// <returns></returns>
public bool IsEmpty()
{
if (Head == null)
return true;
else
return false;
} /// <summary>
/// 清空单链表
/// </summary>
public void Clear()
{
Head = null;
} /// <summary>
/// 获得当前位置单链表中结点的值
/// </summary>
/// <param name="i">结点位置</param>
/// <returns></returns>
public T GetNodeValue(int i)
{
if (IsEmpty() || i < 1 || i > GetLength())
{
Console.WriteLine("单链表为空或结点位置有误!");
return default(T);
} Node<T> A = new Node<T>();
A = Head;
int j = 1;
while (A.Next != null && j < i)
{
A = A.Next;
j++;
} return A.Data;
} /// <summary>
/// 增加新元素到单链表末尾
/// </summary>
public void Append(T item)
{
Node<T> foot = new Node<T>(item);
Node<T> A = new Node<T>();
if (Head == null)
{
Head = foot;
return;
}
A = Head;
while (A.Next != null)
{
A = A.Next;
}
A.Next = foot;
} /// <summary>
/// 增加单链表插入的位置
/// </summary>
/// <param name="item">结点内容</param>
/// <param name="n">结点插入的位置</param>
public void Insert(T item, int n)
{
if (IsEmpty() || n < 1 || n > GetLength())
{
Console.WriteLine("单链表为空或结点位置有误!");
return;
} if (n == 1) //增加到头部
{
Node<T> H = new Node<T>(item);
H.Next = Head;
Head = H;
return;
} Node<T> A = new Node<T>();
Node<T> B = new Node<T>();
B = Head;
int j = 1;
while (B.Next != null && j < n)
{
A = B;
B = B.Next;
j++;
} if (j == n)
{
Node<T> C = new Node<T>(item);
A.Next = C;
C.Next = B;
}
} /// <summary>
/// 删除单链表结点
/// </summary>
/// <param name="i">删除结点位置</param>
/// <returns></returns>
public void Delete(int i)
{
if (IsEmpty() || i < 1 || i > GetLength())
{
Console.WriteLine("单链表为空或结点位置有误!");
return;
} Node<T> A = new Node<T>();
if (i == 1) //删除头
{
A = Head;
Head = Head.Next;
return;
}
Node<T> B = new Node<T>();
B = Head;
int j = 1;
while (B.Next != null && j < i)
{
A = B;
B = B.Next;
j++;
}
if (j == i)
{
A.Next = B.Next;
}
} /// <summary>
/// 显示单链表
/// </summary>
public void Dispaly()
{
Node<T> A = new Node<T>();
A = Head;
while (A != null)
{
Console.WriteLine(A.Data);
A = A.Next;
}
} #region 面试题
/// <summary>
/// 单链表反转
/// </summary>
public void Reverse()
{
if (GetLength() == 1 || Head == null)
{
return;
} Node<T> NewNode = null;
Node<T> CurrentNode = Head;
Node<T> TempNode = new Node<T>(); while (CurrentNode != null)
{
TempNode = CurrentNode.Next;
CurrentNode.Next = NewNode;
NewNode = CurrentNode;
CurrentNode = TempNode;
}
Head = NewNode; Dispaly();
} /// <summary>
/// 获得单链表中间值
/// 思路:使用两个指针,第一个每次走一步,第二个每次走两步:
/// </summary>
public void GetMiddleValue()
{
Node<T> A = Head;
Node<T> B = Head; while (B != null && B.Next != null)
{
A = A.Next;
B = B.Next.Next;
}
if (B != null) //奇数
{
Console.WriteLine("奇数:中间值为:{0}", A.Data);
}
else //偶数
{
Console.WriteLine("偶数:中间值为:{0}和{1}", A.Data, A.Next.Data);
}
} #endregion } public class Node<T>
{
public T Data { set; get; } //数据域,当前结点数据
public Node<T> Next { set; get; } //位置域,下一个结点地址 public Node(T item)
{
this.Data = item;
this.Next = null;
} public Node()
{
this.Data = default(T);
this.Next = null;
}
}
}

  

c# 有序链表合并 链表反转的更多相关文章

  1. LintCode:链表操作(合并与反转)

    描述: (1)翻转一个链表 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null ********************** ...

  2. LeetCode 21 Merge Two Sorted Lists (有序两个链表整合)

    题目链接 https://leetcode.com/problems/merge-two-sorted-lists/?tab=Description   Problem: 已知两个有序链表(链表中的数 ...

  3. [算法]合并链表&删除数组重复项

    合并链表 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-> ...

  4. [LeetCode题解]143. 重排链表 | 快慢指针 + 反转

    解题思路 找到右边链表,再反转右边链表,然后按左.右逐一合并 代码 /** * Definition for singly-linked list. * public class ListNode { ...

  5. 算法基础~链表~排序链表的合并(k条)

    算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...

  6. 6.5 k个已排好序链表合并为一个排序链表

    1 建立链表(带哨兵位的)2 建立最小堆方法3 合并已排好序的k个链表 typedef int DataType; //建立链表 class Link { private: struct Node { ...

  7. 剑指Offer 16. 合并两个排序的链表 (链表)

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目地址 https://www.nowcoder.com/practice/d8b6b4358 ...

  8. 数据结构 merge_link合并链表

    问题描述 本题任务是维护一条非递减的链表,初始长度为 0,记这条链表为主链表.对主链表做 N 次操作,操作分两种:1 k a1 a2 … ak,表示一条长度为 k 且非递减的链表,需要将这条链表合并到 ...

  9. C# 链表 --增 -删-反转-删除最小值

    1. Node.cs namespace 链表 { public class Node<T> { public T Data; //这个就是地址 public Node<T> ...

随机推荐

  1. 【工具】idea工具 java代码 gbk转utf8

    idea工具 https://github.com/downgoon/gbk2utf8 安装在目录下: /usr/local/gbk2utf8/bin 进入目录后直接执行 gbk2utf8 sourc ...

  2. UOJ#110. 【APIO2015】Bali Sculptures 贪心 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ110.html 题解 我们发现n=2000 的子任务保证A=1! 分两种情况讨论: $n\leq 100$ ...

  3. arp_spoof脚本的编写

    协议包分析 ARP原理: 在PC1 访问 Server 的流量 要经过网关  也就是 192.168.1.254 欺骗原理:pc1  与 网关 建立 MAC  ARP 缓存 我们将KALI 攻击机的 ...

  4. 【软件工程】分布式版本控制系统Git的安装与使用

    作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远端库地址:https://github.com/Richa ...

  5. IO操作、PIL使用、Django的admin操作

    操作内存的流-StringIO | BytesIO from io import StringIO, BytesIO #创建操作字符串的内存流 sf = StringsIO() #往内存中写 sf.w ...

  6. 杭电1257 dp(java)

    最少拦截系统 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的 ...

  7. Yarn任务提交流程(源码分析)

    关键词:yarn rm mapreduce 提交 Based on Hadoop 2.7.1 JobSubmitter addMRFrameworkToDistributedCache(Configu ...

  8. React 面向组件化编程 - 封装了webpack - npm run build 产生的包的 /static 引用路径问题

    React 面向组件化编程 面向对象 ----> 面向模块 ----> 面向组件 套路: 注意: 组件名必须大写开头: 只能有一个根标签: <input />虚拟DOM 元素必 ...

  9. 什么是Hash?Hash有哪些特性?

    Hash 把任意长度的输入通过散列算法变换成固定长度的输出 Hash的特性: 输入域无穷,输出域有限.例如:有无穷多个(在工程中可以具体到多少个,例如1000)输入参数经过hash函数映射后得到有限的 ...

  10. python语法_字典_字典操作

    字典:使用映射关系来存储数据的 数据类型 dict = {''name“:"gm","age":"34"} 采用键值对来存储数据 key_v ...