首页 > 其他分享 >单向链表和双向链表的逆序的两种实现方式

单向链表和双向链表的逆序的两种实现方式

时间:2023-04-04 19:45:37浏览次数:34  
标签:head cur 单向 DoubleNode next 链表 null 逆序

单向链表的逆序实现方式

public static class Node{
        private int val;
        private Node next;

        public Node(int val) {
            this.val = val;
        }
    }
/**
实现单向链表的第一种方式,只通过链表指针的重连来实现
*/
 public static Node receiver(Node head){
        Node cur = null;
        Node next = null;
        while(head != null){
            next = head.next;
            head.next = cur;
            cur = head;
            head = next;
        }
        return cur;
    }

 /**
     * 借助list 实现链表翻转。
     * @param head
     * @return
     */
    public static Node receiverList(Node head){
        if (null == head){
            return null;
        }
        ArrayList<Node> nodes = new ArrayList<>();
        while (head != null){
            nodes.add(head);
            head = head.next;
        }

        nodes.get(0).next = null;
        int len = nodes.size();
        for (int i = 1; i < len;i++){
            nodes.get(i).next = nodes.get(i - 1);
        }
        return nodes.get(len -1);
    }

双向链表的实现逆序的两种方式

 public static class DoubleNode{
        private int val;
        private DoubleNode last;
        private DoubleNode next;

        public DoubleNode(int val) {
            this.val = val;
        }
    }
/**
指针重连的方式实现双向链表的逆序
*/
  public static DoubleNode receiverDoubleNode(DoubleNode head){
        DoubleNode cur  = null;
        DoubleNode next = null;
        while(head != null){
            next = head.next;
            head.next = cur;
            head.last = next;
            head = next;
            cur = head;
        }
        return cur;
    }

  /**
通过数组实现双向链表逆序
  */
  public static DoubleNode testReverseDoubleList(DoubleNode head) {
        if (head == null) {
            return null;
        }
        ArrayList<DoubleNode> list = new ArrayList<>();
        while (head != null) {
            list.add(head);
            head = head.next;
        }
        list.get(0).next = null;
        DoubleNode pre = list.get(0);
        int N = list.size();
        for (int i = 1; i < N; i++) {
            DoubleNode cur = list.get(i);
            cur.last = null;
            cur.next = pre;
            pre.last = cur;
            pre = cur;
        }
        return list.get(N - 1);
    }

标签:head,cur,单向,DoubleNode,next,链表,null,逆序
From: https://www.cnblogs.com/vip1024/p/17287702.html

相关文章

  • 25. K 个一组翻转链表
    25.K个一组翻转链表给你链表的头节点head,每 k 个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。......
  • 合并两个有序链表
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]提示:两个链表的节点数目范围是[0,50......
  • 138. 复制带随机指针的链表
    /*//DefinitionforaNode.classNode{public:intval;Node*next;Node*random;Node(int_val){val=_val;next=NULL;random=NULL;}};*/classSolution{public:Node*copyRandomList(Node*......
  • 链表练习3
    已知整型链表,设计算法,在所有结点值为x的结点前插入结点值为y的结点,插入的结点个数通过函数值返回。#include<stdio.h>#include<stdlib.h>typedefstructnode{//用Node代替structnodeinta;structnode*next;}Node,*LinkList;LinkListcreate();Link......
  • 复杂链表的复刻
    暴力做法时间复杂度 O(n^2)遍历一遍,复制next指针,新建链表遍历第二遍,复制random指针,查找每一个random节点的位置classSolution{public:ListNode*copyRandomList(ListNode*head){ListNode*dummy=newListNode(-1),*tail=dummy;if(!hea......
  • 最长连续序列(并查集、数组)、复原 IP 地址(字符串、回溯)、删除链表的倒数第 N 个结
    最长连续序列(并查集、数组)给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)__的算法解决此问题。示例1:输入:nums=[100,4,200,1,3,2]输出:4解释:最长数字连续序列是[1,2,3,4]。它的长度为4......
  • 剑指offer(Java)-数组中的逆序对(困难)
    题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例1:输入:[7,5,6,4]输出:5限制:0<=数组长度<=50000解题思路:这道题的核心在于归并排序,在归并排序的基础上进行求解逆序对。题解参......
  • 环形链表
    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos......
  • 【专题】排列逆序数的奇偶性
    排列逆序数的奇偶性是一个十分常见的属性。不同于直接求逆序数,由于排列的性质,这玩意是可以\(\mathcalO(n)\)直接求解的。为了完成这一点,引入如下基本结论:排列两元素对换,逆序数奇偶性改变。排列的逆序数同余\(n-\#\)环。第一点,在大多数线性代数教材中都有所提及。第二......
  • 带环的单链表追击之拓展证明
    对于单链表有环问题,上一期,我们已经详细讲解了!!而快慢指针功不可没!!对于本期我们再次回顾,链表有环问题时,不难心中存在一个疑问,一定能追得上吗?会不会错过??那么为什么??为何能追上,什么情况下会追不上!!这就是我们今天讨论的重点!!假设单链表有环,快指针每次走两步,而慢指针每次走一步!!那么,快慢指......