题目描述

输入一个链表,反转链表后,输出新链表的表头。

一 . 概念普及

关于线性表等相关概念请点击这里

二 . 实现方法

目前,可以有两种方法实现该要求。

方法一:借助外部空间实现。这里可以将单链表储存为数组,然后按照数组的索引逆序进行反转。此处,可理解为将链表装换为顺序表,然后把队伍方向反转,但是,此方式比较浪费空间,而且需要两次遍历,效率不占优势。

代码实现:

public static Node ReverseList1(Node head)
{
//指针是否为空判断(鲁棒性)
if(head == null)
{
return null;
}
//定义新的链表nodeList
List<Node> nodeList = new List<Node>();
//当head不为空时,执行
while (head != null)
{
nodeList.Add(head);
head = head.Next;
}
//
int startIndex = nodeList.Count - ;
for (int i = startIndex; i >= ; i--)
{
Node node = nodeList[i];
if (i == )
{
node.Next = null;
}
else
{
node.Next = nodeList[i - ];
}
}
// 现在头结点是原来的尾节点
head = nodeList[startIndex];
return head;
}

方法二:三指针法,不做过多阐述,代码备注蛮详细的。下图即为具体实现过程。

代码实现:

class Solution
{
public ListNode ReverseList(ListNode pHead)
{
// write code here
//鲁棒判定
if(pHead == null)
{
return null;
}
//定义A B 两个指针
ListNode A = null;
ListNode B = null;
//循环操作
while(pHead != null)
{
//定义B为PHead后面的数,定义A为pHead前面的数
B = pHead.next;
pHead.next = A; //这一部分就理解成A是PHead前面的那个数吧。
//然后再把A和pHead都提前一位
A = pHead;
pHead = B;
}
//循环结束后,返回新的表头,即原来表头的最后一个数。
return A;
}
}

当然,用递归也能实现哦。该题鲁棒判断在于指针是否为空。

剑指Offer的学习笔记(C#篇)-- 反转链表的更多相关文章

  1. 剑指Offer的学习笔记(C#篇)-- 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...

  2. 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...

  3. 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...

  4. 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  5. 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将  num1[0], num2[0 ...

  6. 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...

  7. 剑指Offer的学习笔记(C#篇)-- 二叉树的深度(详讲递归)

    题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 一 . 思维发散 借助这个题目,我想用一个更好理解的方法说一说递归. ...

  8. 剑指Offer的学习笔记(C#篇)-- 数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. 一 . 题目分析 该题目并不是难题,但该题目考察目的是正确的选择合适的查找方法.题目中有一个关键词是:排序数组,也就是说,该数组已经排好了,我一开始直接 ...

  9. 剑指Offer的学习笔记(C#篇)-- 对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 一 . 题目分析 递归法. 一.空树判断,单独搞出来. 二.非空树. 递归:一 ...

随机推荐

  1. rails debug

    =debug @thesis config下配置 东西需要重启之后才管用

  2. java高级特性增强

    第4天 java高级特性增强 今天内容安排: 1.掌握多线程 2.掌握并发包下的队列 3.了解JMS 4.掌握JVM技术 5.掌握反射和动态代理 java多线程增强 .1. java多线程基本知识 . ...

  3. Python中出现“TabError: inconsistent use of tabs and spaces in indentation”问题的解决

  4. POJ 3071 Football:概率dp

    题目链接:http://poj.org/problem?id=3071 题意: 给定n,有2^n支队伍参加足球赛. 给你所有的p[i][j],表示队伍i打败队伍j的概率. 淘汰赛制.第一轮(1,2)两 ...

  5. 转载h5问题总结

    判断微信浏览器 function isWeixin(){ var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger ...

  6. MySQL存储过程示例

    MySQL存储过程: /*自定义结束符*/ DELIMITER $$ /*如果存在同名的存储过程就删除*/ DROP PROCEDURE IF EXISTS prAddBlack$$ /*创建存储过程 ...

  7. selenium中类名不能与方法名相同

    不要将selenium中的类名命名成需要用到的方法名,不然会报错!

  8. AtCoder AGC #2 Virtual Participation

    在知乎上听zzx大佬说AGC练智商...于是试了一下 A.Range Product 给$a$,$b$,求$\prod^{b}_{i=a}i$是正数,负数还是$0$ ...不写了 B.Box and ...

  9. ACM学习历程——POJ3468 A Simple Problem with Integers(线段树)

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  10. 使用EA完成数据库设计

    开始重构之后对于EA的了解也逐渐增多,今天就总结一下如何使用EA完成对数据库的设计.下边的图分别是截自机房收费系统和牛腩新闻开发的数据库,因为我第一遍写的时候是在机房合作的时候,而后建立牛腩新闻发布系 ...