链表反转分这么两种情况,

一种是链表头节点始终前置,那这时候需要传一个头节点特有的标记;(简称:头不转)

HEAD->Test1->Test2->Test3->Test4

反转后:

HEAD->Test4->Test3->Test2->Test1


另一种是不管头节点,连同头节点一起反转。 (简称:头也转)

HEAD->Test1->Test2->Test3->Test4

反转后:

Test4->Test3->Test2->Test1->HEAD


不管转不转头,都有递归实现和非递归实现。

先看一下我的链表类。

    public class LinkNode<T>
{
public T Data { get; set; }
// public LinkNode<T> prev { get; set; }
public LinkNode<T> Next { get; set; } public LinkNode(T data)
{
this.Data = data;
Next = null;
}
public LinkNode()
{
this.Next=null;
} }
    public class LinkList<T>
{
public LinkNode<T> Head;
public LinkList()
{
Head = new LinkNode<T>();
}
public void AddLinkNode(T valueToAdd)
{
var newNode = new LinkNode<T>(valueToAdd);
LinkNode<T> tmp = Head;
while (tmp.Next != null)
{
tmp = tmp.Next;
}
tmp.Next = newNode; }
public void PrintAllNodes()
{
LinkNode<T> tmp = Head;
while (tmp != null)
{
Console.WriteLine(tmp.Data);
tmp = tmp.Next;
}
}
}

好了,然后看一下

①头也转情况的递归实现:

        /// <summary>
/// 头也转的递归实现
/// </summary>
/// <param name="node1"></param>
/// <param name="node2"></param>
/// <returns></returns>
public LinkNode<T> ReverseRecursiveNohead(LinkNode<T> node1, LinkNode<T> node2)
{
bool head = false;
if (node1 == this.Head) head = true;
LinkNode<T> tmp = node2.Next;
node2.Next = node1;
if (head) node1.Next = null;
if (tmp == null) {
return node2; }
else
{
return ReverseRecursiveNohead(node2, tmp);
}
}

main中调用

            var linklist = new LinkList<string>();
Console.WriteLine("______原始链表打印________");
linklist.Head.Data = "HEAD";
linklist.AddLinkNode("test1");
linklist.AddLinkNode("test2");
linklist.AddLinkNode("test3");
linklist.AddLinkNode("test4");
linklist.PrintAllNodes();
Console.WriteLine("______头也转的递归实现________"); linklist.Head= linklist.ReverseRecursiveNohead(linklist.Head, linklist.Head.Next);
linklist.PrintAllNodes();

效果:

②头也转情况的非递归实现:

/// <summary>
/// 头也转的非递归实现
/// </summary>
/// <param name="head"></param>
/// <returns></returns>
public LinkNode<T> ReverseNonRecursive(LinkNode<T> head)
{
LinkNode<T> tmp1 = new LinkNode<T>(), tmp2 = new LinkNode<T>();
while (head != null)
{
tmp2 = head.Next;//save next head
head.Next = tmp1;
tmp1 = head;
head = tmp2; }
return tmp1; }

main中调用

            var linklist = new LinkList<string>();
Console.WriteLine("______原始链表打印________");
linklist.Head.Data = "HEAD";
linklist.AddLinkNode("test1");
linklist.AddLinkNode("test2");
linklist.AddLinkNode("test3");
linklist.AddLinkNode("test4");
linklist.PrintAllNodes();
Console.WriteLine("_______头也转的非递归实现_______");
linklist.Head = linklist.ReverseNonRecursive(linklist.Head);
linklist.PrintAllNodes();

效果:

③头不转的递归实现:

/// <summary>
/// 头结点不转,头始终是头的递归实现
/// </summary>
/// <param name="node1"></param>
/// <param name="node2"></param>
/// <param name="head"></param>
/// <returns></returns>
public LinkNode<T> ReverseRecurse(LinkNode<T> node1,LinkNode<T> node2,T head){
if (node2 == null)
{
return null;
}
else
{
if (node2.Next == null)
{
Head.Next = node2;
node2.Next = node1;
node1.Next = null;
return Head;
}
else
{
ReverseRecurse(node2, node2.Next,head);
node2.Next = node1;
if (node2.Next.Data.Equals(head))
{
node2.Next = null;
return Head;
}
node1.Next = null;
return Head;
}
} }

main中调用

            var linklist = new LinkList<string>();
Console.WriteLine("______原始链表打印________");
linklist.Head.Data = "HEAD";
linklist.AddLinkNode("test1");
linklist.AddLinkNode("test2");
linklist.AddLinkNode("test3");
linklist.AddLinkNode("test4");
linklist.PrintAllNodes(); Console.WriteLine("_______头不转的递归实现_______");
linklist.ReverseRecurse(linklist.Head,linklist.Head.Next,"HEAD");
linklist.PrintAllNodes();

效果:

好像还差一种,大家自己发挥~

C# 链表反转的更多相关文章

  1. 链表反转leetcode206

    最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...

  2. 链表反转 (Multi-method)

    链表反转是链表相关问题最基础的知识,做完LeetCode中LinkedList后才会有这种体会,因为ACM算法中不会涉及这一部分.解决这一问题有多种方法,在面试中面试官通常也会要求写出多种.包括sta ...

  3. java实现单链表反转

    一.简介 经查阅,主要有两种方法实现链表反转,递归反转法和遍历反转法: 递归: 在反转当前结点之前先反转其后边的结点,即.从尾结点开始逆向反转各个节点的指针域指向: 遍历:从前往后反转各个结点的指针域 ...

  4. C++ 单向链表反转

    单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...

  5. c语言:链表排序, 链表反转

    下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...

  6. 【Java数据结构】Java数据结构之链表反转

    我们都知道用C可以很简单的实现单链表反转,今天来学习下,在Java中如何实现链表反转. 思路很简单,定义一个类,这个类分成2块,一块是表示自身的标志,另外一个存储指向下一个元素的引用.通过互换相邻两个 ...

  7. [LeetCode] 链表反转相关题目

    暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...

  8. 单链表反转(Singly Linked Lists in Java)

    单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法   package dsa.linkedlist; public class Node<E> ...

  9. 【easy】206. Reverse Linked List 链表反转

    链表反转,一发成功~ /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; ...

  10. java实现单链表反转(倒置)

    据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. 1 public class Node { 2 int index; ...

随机推荐

  1. Doctrine2-基础概念

    使用框架操作数据库的几个要求 1.安全,比如防止sql注入等,pdo里面prepare,execute 就可以 2.性能,数据库操作是最基本的操作,频繁使用,需要考虑到执行效率 3.ORM(objec ...

  2. 自学华为IoT物联网_08 IoT连接管理平台介绍

    点击返回自学华为IoT物流网 自学华为IoT物联网_08 IoT连接管理平台介绍 一.IoT连接管理平台的由来 1.1  物联网产业发展面临的挑战 新业务上线周期长,应用碎片化,开发周期长,场频上市慢 ...

  3. vw实现移动端自适应页面

    一.设备支持情况 测试网站:https://caniuse.com/#search=vw css3test:https://airen.github.io/css3test/,https://gith ...

  4. Hibernate 单向一对多映射

    单向 n-1: 单向 n-1 关联只需从 n 的一段访问 1 的一端 此处 Order 类和 Customer 类,其中 Order 类需要引用 Customer 类 代码: public class ...

  5. 【C语言程序】输出前50个素数

    #include <stdio.h> #include <stdlib.h> int main(void) {  ;  ;  ){   ;   ;i<x;i++){    ...

  6. 小甲鱼Python第二十三讲课后习题--025,字典

    笔记: 1.字典是Python中唯一的映射类型 2.字典包含两个要素:键(key)和值(value)他们是成对出现的,用大括号括起来,多对存在时用逗号隔开. 3.可以用dict()直接创建字典,如di ...

  7. 13、vue.js简单入门

    本篇导航: 介绍与安装 vue常用指令 一.介绍与安装 vue是一套构建用户界面的JAVASCRIPT框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层, ...

  8. (84)Wangdao.com第十八天_JavaScript Promise 对象

    Promise 对象 是 JavaScript 的异步操作解决方案,为异步操作提供统一接口. 目前 JavaScript 原生支持 Promise 对象 它起到代理作用(proxy),充当异步操作与回 ...

  9. Windows系统Git安装配置

    Git的安装 Git是一个开源的分布式的版本控制软件,是Linus Torvalds 为了方便开源贡献者协同开发和管理 Linux 内核开发替代BitKe而开发的. 打开git官网的下载地址:http ...

  10. CAJ转换成PDF在线方法是什么

    做学术性的朋友经常会需要将CAJ文件转换成PDF文件,毕竟CAJ文件只能在CAJ阅读器上显示,但是有很多转换软件并不能很好的完成转换,小编今天就为大家讲解一下CAJ转换成PDF在线方法是什么,大家要认 ...