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. SpringBoot整合Dubbo,并实现dubbo实现动态调用

    在一些业务场景中,CP定单提交过来,需要提交到不同的通道进行业务处理 本文通过Dubbo以定义一个interface,各个通道方来实现这个接口.通过group来区分不同的通道 有需要的同学可以下载 示 ...

  2. Imcash平台测评报告

    ImCash是由全球知名量子基金(QuantumFund)与美国好事达保险公司 (ALL ) 联合投资美国区块链金融资本(BFC)打造全球首款量子基金数字资产服务平台 . ImCash作为全球首款量子 ...

  3. Terraria(泰拉瑞亚)存档覆盖(Linux)

    这是一篇关于游戏的不正经博客 ~ 游戏介绍: <泰拉瑞亚>是由Re-Logic公司开发的一款高自由度的沙盒游戏,于2011年5月16日在PC上发行. 玩家可以在游戏中做很多事情:制造武器战 ...

  4. UVA 548 Tree 建树

    题意: 输入中序和后序的权值,输出哪个叶子使它到根的路径上权和最小. 思路: 输入后建树,然后dfs求最小的叶子. #include<iostream> #include<cstdi ...

  5. XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship

    A. Apple 按题意模拟即可. #include<stdio.h> #include<iostream> #include<string.h> #include ...

  6. ACM常用STL

    转载于https://blog.csdn.net/riba2534/article/details/61929000 1.  stack stack<int>st;//栈st,用于存放in ...

  7. [LeetCode] Goat Latin 山羊拉丁文

    A sentence S is given, composed of words separated by spaces. Each word consists of lowercase and up ...

  8. virtualenvwrapper虚拟环境

    之前学习过python的虚拟环境virtualenv,而virtualenvwrapper这个软件包可以让我们管理虚拟环境变得更加简单,不用再跑到某个目录下通过virtualenv来创建虚拟环境,并且 ...

  9. PHP 可以获取客户端哪些访问信息---来自网页转载

    php是一种弱类型的程序语言,但是最web的 在程序语言中有系统全局函数: $_SERVER <?php echo "".$_SERVER['PHP_SELF'];#当前正在 ...

  10. django的闪现和增、删、改、查

    使用 messages 闪现在views.py中导入 from django.contrib import messages 在html中 {% if messages %} {% for mess ...