算法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;
        }

    }
相关推荐
Pniubi15 分钟前
关于算法用现成数据结构和手撕
数据结构
唐墨1232 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏2 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆7 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落7 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black7 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791210 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔10 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆10 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac
老师我太想进步了202611 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法