让我们来写个算法吧,(1)翻转单链表

作为面试中最最最常考的链表题之一,翻转单链表。有以下两种解法:

例: 输入 1->2->3->4  输出 4->3->2->1

  Node类定义如下

class Node {

    int value;

    Node next;

    public Node(int value, Node next) {
        this.value = value;
        this.next = next;
    }

1.遍历法

  此方法根据链表遍历,通过拆分,刷新节点来达到翻转单链表的功能。

  

  草稿过程

    第一次遍历 主链表 2->3->4   输出链表 1

    第二次遍历 主链表3->4         输出链表 2->1  

    第三次遍历 主链表 4        输出链表 3->2->1

    第四次遍历 主链表           输出链表 4->3->2->1

  分析过程完了,我们上代码咯:

  

public static Node reverseNode(Node node) {
   // 因为node节点会发生变化,所以用于存储node节点      Node tmp = null;   Node  result =null;

  while(node!=null){    // 先存起来    node.next = tmp;        node.next = result;

    result = node;        //上面两步是为了保存每次的断开节点,第一次遍历,result =null; 1.next =null; result =1 ;
    //第二次遍历,result =1; 2.next =1; result =2->1 ;
    node = tmp;  }
    return result;
}

2.递归法

  主要是通过程序栈保留的案发现场进行节点的断开和重组

  

  

    public static Node reverseNode(Node node) {

        if(node==null || node.next == null) {
            return node;
        }
        //案发现场
        Node temp = node.next;
        Node returnNode = reverseNode(node.next);
        // 从当前节点断开
        node.next = null;
        // 用案发现场的节点指向当前节点
        temp.next = node;

        return returnNode;

    }

原文地址:https://www.cnblogs.com/leaveast/p/12289328.html

时间: 2024-10-29 04:32:43

让我们来写个算法吧,(1)翻转单链表的相关文章

算法题:反转单链表

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:存在一个单链表,头指针为head,实现单链表的反转Node *Reverse(Node *head).  该算法的求解办法有很多,如: 方法1:先顺序变量单链表,将结点保存到栈中,在从栈中弹出结点,重新建立一个新的单链表: 方法2:用<剑指offer>里面给出的算法,用三个指针来实现: 方法3:采用递归实现,是方法2的递归实现形式. 本文主要给出方法2和方法3,在给出具体的代码之前,先要注意几个问题:          (1)如果hea

数据结构与算法系列四(单链表)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

7. C#数据结构与算法 -- 存储结构(单链表)

C#定义并实现单链表 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Linked {     //单链表结点类,采用泛型       public class Node<T> {         private T data; //数据域,当前结点的数据           private 

算法总结之 在单链表和双链表中删除倒数第k个节点

分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 当链表走到头时候 如果k值大于0   说明不用调整  因为链表根本没有倒数第k个节点 此时将原链表直接返回即可 如果k值=0,说明链表倒数第k个节点就是头节点,此时直接返回head.next 也就是原链表的第二个节点 让第二个节点作为链表的头节点,此时直接返回head.next 如果k值<0  重新从

[PTA] 数据结构与算法题目集 6-1 单链表逆转

List Reverse(List L) { List p, q; p = L; q = L; L = NULL; while (p) { p = p->Next; q->Next = L; L = q; q = p; } return L; } 原文地址:https://www.cnblogs.com/ruoh3kou/p/9975225.html

算法练习2之单链表求和

笔试题目: 1.用单向链表表示十进制整数,求两个正整数的和.如下图,1234+34=1268, 注意:单向链表的方向,不允许使用其他的数据结构. 题目分析: 题目中提到了,数据结构只能使用单链表,所以数组不在考虑范围之内. 因为将数字转为单链表以后,最高位排在表头,而我们进行整数加法的时候,是从个位开始的,与单链表的顺序相反.所以我们考虑对链表进行反转,然后再做加法. 其中反转和求和的示意图如下: 对求和以后的结果再进行反转: 下面是C++的实现 代码解读 1.节点的数据结构定义如下: //节点

算法与数据结构基础3:简单单链表List类的实现

简单的单链表实现,数据类型定义成了int,如果要通用,需要改成模板类,然后稍微修改下就可以了. // List.h #include <cstdio> #include <cassert> #include <iostream> using namespace std; class List { public: // ************************************************************************** //

【算法整理】听说你写的算法很牛?-优质算法衡量标准探讨

引文 我有个朋友有算法强迫症,每次一看到别人写的算法,就有上去改的冲动,不然就会偏头疼,主要症结在于他认为别人写的算法不好,但是什么的算法可以评判为好,什么样的算法可以评判为不好?最近为了治愈他,我特地写了这篇文章. 算法的衡量从两个方向出发:时间复杂度和空间复杂度.本文主要是不讲具体算法,只将算法的衡量,重点讲解如何衡量算法的复杂度,解决平时见到的XX算法时间复杂是O(logn)O(logn),其中这个结果是怎么推导出来的?lognlogn是个什么玩意儿?,大写的OO是什么意思?为什么用这个符

请写一个算法,用于将list集合内重复元素剔除

package Homework; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Scanner;/** * list集合是否可以包含重复元素? * 如果可以,请写一个算法,用于将list集合内重复元素剔除. * @author 张致远 * */public class Homework2 { public static void main(String[]