算法4之链表

概述

单双链表的反转,单链表实现队列

单链表反转

链表节点的定义

java 复制代码
public class ListNode<V> {
    public V val;
    public ListNode<V> next;
    ListNode() {}
    ListNode(V val) { this.val = val; }
    ListNode(V val, ListNode<V> next) { this.val = val; this.next = next; }
}

单链表反转,leetcode: https://leetcode.cn/problems/reverse-linked-list/description/

java 复制代码
 /**
     * 单链表的反转
     * <a href="https://leetcode.cn/problems/reverse-linked-list/description/">...</a>
     * null-1-2-3-4-5
     * pre = null
     * head = 1
     * next = head.next
     * head.next = pre
     * pre = head
     * head = next
     * 先记住下一个值,然后改变指针方向。然后pre和head各流转到下一个值
     */
    public ListNode reverseList(ListNode head){
        if(head == null){
            return head;
        }
        ListNode pre = null;
        ListNode next = null;
        while(head != null) {
            next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return head;
    }

双链表的反转

双链表节点的定义

java 复制代码
public class DoubleNode<V> {

    V val;
    DoubleNode<V> next;
    DoubleNode<V> last;
    DoubleNode() {}
    DoubleNode(V val) { this.val = val; }
    DoubleNode(V val, DoubleNode<V> next, DoubleNode<V> last) { this.val = val; this.next = next; this.last = last;}

}

双链表反转

java 复制代码
/**
     * 双链表的反转
     * -
     * 思路和单链表一样,只不过是多了一个指针。
     * 先记住下一个值,然后改变指针方向。然后pre和head各流转到下一个值
     */
    public DoubleNode reverseDoubleList(DoubleNode head){
        if(head == null){
            return head;
        }
        DoubleNode pre = null;
        DoubleNode next = null;
        while(head != null) {
            next = head.next;
            head.next = pre;
            head.last = next;
            pre = head;
            head = next;
        }
        return head;
    }

单链表实现队列

java 复制代码
class MyQueue<V>{
        // head记录队列的头节点
        private ListNode<V> head;
        // tail记录队列的尾节点
        private ListNode<V> tail;
        // 队列大小
        private int size;

        // 判空
        public boolean isEmpty(){
            return this.size == 0;
        }

        // 获取队列长度
        public int size(){
            return this.size;
        }

        /**
         * 元素压入队列
         * 更新head,tail,size
         * 思路:
         * 压入第一个元素,比如1,那么head=1,tail=1;
         * 压入第二个元素,比如2,那么1-2,即head=1, tail=2;
         * 压入第三个元素,比如3,那么1-2-3,即head=1, tail=3;
         * ...
         * 压入第i个元素,比如i,那么1-2-3...-i,即head=1,tail=i;
         * 每次压入元素时,原来的tail元素指向新压入的元素。即tail.next = cur;
         * tail都会更新,即tail = cur;
         * @param value 元素
         */
        public void offer(V value){
            ListNode<V> cur = new ListNode<>(value);
            if(tail == null){
                head = cur;
                tail = cur;
            }else{
                tail.next = cur;
                tail = cur;
            }
            size++;
        }

        /**
         * 元素弹出队列
         * 遵循队列,先进先出的特点,所以每次弹出的都是队列的head
         * 思路:
         * 如果队列不为空
         * 比如,当前队列是:1-2-3-4-5,head=1,tail=5;
         * 此时弹出,那么head会更新,head = head.next;
         *
         * 如果队列为空
         * 那么head = null; 此时注意tail要和head保持一致,否则会出现head=null,但是tail=5的情况
         */
        public V poll(){
            V res = null;
            if(head != null){
                res = head.val;
                head = head.next;
                size--;
            }else{
                tail = head;
            }
            return res;
        }

        // 返回队列头部元素
        public V peek(){
            if(head != null){
                return head.val;
            }
            return null;
        }

    }
相关推荐
田梓燊2 小时前
红黑树分析 1
算法
晚风吹长发2 小时前
二分查找算法+题目详解
c++·算法·二分查找
悠悠~飘2 小时前
18.PHP基础-递归递推算法
算法·php
pilgrim533 小时前
结合 Leetcode 题探究KMP算法
算法·leetcode
罗义凯3 小时前
其中包含了三种排序算法的注释版本(冒泡排序、选择排序、插入排序),但当前只实现了数组的输入和输出功能。
数据结构·c++·算法
kevien_G13 小时前
JAVA之二叉树
数据结构·算法
syt_biancheng4 小时前
Day3算法训练(简写单词,dd爱框框,3-除2!)
开发语言·c++·算法·贪心算法
二进制的Liao4 小时前
【编程】脚本编写入门:从零到一的自动化之旅
数据库·python·算法·自动化·bash
自然数e5 小时前
C++多线程【线程管控】之线程转移以及线程数量和ID
开发语言·c++·算法·多线程
云在Steven5 小时前
在线确定性算法与自适应启发式在虚拟机动态整合中的竞争分析与性能优化
人工智能·算法·性能优化