c# 有序链表合并 链表反转
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# 有序链表合并 链表反转的更多相关文章
- LintCode:链表操作(合并与反转)
描述: (1)翻转一个链表 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null ********************** ...
- LeetCode 21 Merge Two Sorted Lists (有序两个链表整合)
题目链接 https://leetcode.com/problems/merge-two-sorted-lists/?tab=Description Problem: 已知两个有序链表(链表中的数 ...
- [算法]合并链表&删除数组重复项
合并链表 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1-> ...
- [LeetCode题解]143. 重排链表 | 快慢指针 + 反转
解题思路 找到右边链表,再反转右边链表,然后按左.右逐一合并 代码 /** * Definition for singly-linked list. * public class ListNode { ...
- 算法基础~链表~排序链表的合并(k条)
算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...
- 6.5 k个已排好序链表合并为一个排序链表
1 建立链表(带哨兵位的)2 建立最小堆方法3 合并已排好序的k个链表 typedef int DataType; //建立链表 class Link { private: struct Node { ...
- 剑指Offer 16. 合并两个排序的链表 (链表)
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目地址 https://www.nowcoder.com/practice/d8b6b4358 ...
- 数据结构 merge_link合并链表
问题描述 本题任务是维护一条非递减的链表,初始长度为 0,记这条链表为主链表.对主链表做 N 次操作,操作分两种:1 k a1 a2 … ak,表示一条长度为 k 且非递减的链表,需要将这条链表合并到 ...
- C# 链表 --增 -删-反转-删除最小值
1. Node.cs namespace 链表 { public class Node<T> { public T Data; //这个就是地址 public Node<T> ...
随机推荐
- .net core2.x - 关于工作单元(UnitOfWork) 模式
概要:在搭建框架,顺手说下写下,关于unitofwork,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧. 1.工作单元(unitofowork)是什么(后面简写uow)? ...
- asp+SqlServer2008开发【第一集:安装SqlServer2008以及登陆】
参考:https://blog.csdn.net/i_likechard/article/details/75299983 1,安装sqlServer2008的具体步骤参考网上其他教程,自己根据注释引 ...
- SSH项目需要的所有架包
原地址:https://blog.csdn.net/qq_35816104/article/details/54346182 SSH框架:struts2 hibernate spring 该三大框 ...
- Andy's First Dictionary---set,stringstream
https://cn.vjudge.net/contest/177260#problem/C stringstream :https://blog.csdn.net/xw20084898/articl ...
- Palindrome POJ - 3974 (字符串hash+二分)
Andy the smart computer science student was attending an algorithms class when the professor asked t ...
- 通过ViewPager 实现图片轮播
通过ViewPager 实现图片轮播 首先来个效果图 布局文件: LinearLayout 用来存放下方的几个小白点. <?xml version="1.0" encodin ...
- postman基本使用
一.安装 官网:https://www.getpostman.com/ Postman是一个Chrome的一个插件工具,我们可以通过Chrome的应用商店进行进行搜索并安装,安装完成会在桌面上显示一个 ...
- __x__(6)0905第二天__标签属性=“值”
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- laravel之构造器操作数据库
使用构造器来查询的优点是可以方式sql注入 1.插入 2.修改数据库 3.删除 4.查询
- 在线协作开发工具apizza使用方法(https://apizza.net/projects)
1. 2. 3. 4. 5. 谷歌浏览器点击选择“更多工具”->“扩展程序” 6. 将刚才解压好的文件夹拖到这个位置即可