首页 > 其他分享 >6、递归链表

6、递归链表

时间:2023-04-10 14:44:47浏览次数:61  
标签:node index return 递归 Node 链表 public size

链表具有天然的递归结构,下面我们将用递归实现链表的所有操作

public class LinkedListR<E> {

    private class Node {
        public E e;
        public Node next;

        public Node(E e, Node next) {
            this.e = e;
            this.next = next;
        }

        public Node(E e) {
            this(e, null);
        }

        public Node() {
            this(null, null);
        }

        @Override
        public String toString() {
            return e.toString();
        }
    }

    private Node head;
    private int size;

    public LinkedListR() {
        head = null;
        size = 0;
    }

    public int getSize() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 添加
     */
    public void add(int index, E e) {
        if (index < 0 || index > size) throw new RuntimeException("need 0 <= index <= size");

        head = add(head, index, e);
        size++;
    }

    /**
     * <p>以 node 为头结点的链表, 给它的 index 位置添加元素 e, 并返回新链表的头结点
     * <p>注意: 此函数并不维护 size
     */
    private Node add(Node node, int index, E e) {
        if (index == 0) return new Node(e, node);

        node.next = add(node.next, index - 1, e);
        return node;
    }

    public void addFirst(E e) {
        add(0, e);
    }

    public void addLast(E e) {
        add(size, e);
    }

    /**
     * 删除
     */
    public E remove(int index) {
        if (index < 0 || index >= size) throw new RuntimeException("need 0 <= index < size");

        Pair<Node, E> pair = remove(head, index);
        head = pair.getKey();
        size--;
        return pair.getValue();
    }

    /**
     * <p>以 node 为头结点的链表, 删除它 index 位置的元素, 并返回新链表的头结点和被删除的元素 e
     * <p>注意: 此函数并不维护 size
     */
    private Pair<Node, E> remove(Node node, int index) {
        if (index == 0) return new Pair<>(node.next, node.e);

        Pair<Node, E> pair = remove(node.next, index - 1);
        node.next = pair.getKey();

        return new Pair<>(node, pair.getValue());
    }

    public E removeFirst() {
        return remove(0);
    }

    public E removeLast() {
        return remove(size - 1);
    }

    public void removeElement(E e) {
        head = removeElement(head, e);
    }

    /**
     * <p>以 node 为头结点的链表, 删除它中 "所有的" 元素 e, 并返回新链表的头结点
     * <p>注意: 此函数会维护 size
     */
    private Node removeElement(Node node, E e) {
        if (node == null) return null;

        node.next = removeElement(node.next, e); // "所有的" 体现在这里
        if (node.e.equals(e)) {
            node = node.next;
            size--;
        }
        return node;
    }

    /**
     * 修改
     */
    public void set(int index, E e) {
        if (index < 0 || index >= size) throw new RuntimeException("need 0 <= index < size");

        set(head, index, e);
    }

    /**
     * 以 node 为头结点的链表, 把它 index 位置的元素修改为 e
     */
    private void set(Node node, int index, E e) {
        if (index == 0) node.e = e;
        else set(node.next, index - 1, e);
    }

    /**
     * 查看
     */
    public E get(int index) {
        if (index < 0 || index >= size) throw new RuntimeException("need 0 <= index < size");

        return get(head, index);
    }

    /**
     * 以 node 为头结点的链表, 获得它 index 位置的元素
     */
    private E get(Node node, int index) {
        if (index == 0) return node.e;
        return get(node.next, index - 1);
    }

    public E getFirst() {
        return get(0);
    }

    public E getLast() {
        return get(size - 1);
    }

    public boolean contains(E e) {
        return contains(head, e);
    }

    /**
     * 以 node 为头结点的链表, 查询它中否有元素 e
     */
    private boolean contains(Node node, E e) {
        if (node == null) return false;
        
        if (node.e.equals(e)) return true;
        return contains(node.next, e);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (Node cur = head; cur != null; cur = cur.next) {
            sb.append(cur).append("->");
        }
        sb.append("NULL");
        return sb.toString();
    }
}

标签:node,index,return,递归,Node,链表,public,size
From: https://www.cnblogs.com/n139949/p/17302868.html

相关文章

  • 线性表之静态链表实现(数组cur实现)
    main.cpp#include"StaticList.h"intmain(){StaticListSL;InitSList(SL);for(inti=0;i<5;++i){Insert(SL,'A'+i);}ShowSList(SL);DeleteSList(SL);ShowSList(SL);return0;}Stati......
  • 线性表之单循环链表实现
    main.cpp#include"SCList.h"intmain(){Listmylist;InitList(mylist);intselect=1;ElemTypeItem;Node*p=NULL;while(select){printf("************************************\n");printf("......
  • 搜索二叉树转换成双向链表
    搜索二叉树:每个节点的左子树的值都小于当前节点,右子树的节点值都大于当前节点。其中序遍历就是一个有序的序列转化成双向链表,需要记录一下头节点,和前一个节点,将前一个节点和当前节点相连preheadconvert(pRoot){if(pRoot==null)returnnull;convert(pRoot.left);......
  • 算法-递归三(树形结构)
    publicclassSolution{publicIList<IList<int>>Permute(int[]nums){varrtItem=newList<int>();varvisited=newDictionary<int,bool>();IList<IList<int>>rt=newList<IList<int&......
  • 剑指 Offer 36. 二叉搜索树与双向链表
    题目链接:剑指Offer36.二叉搜索树与双向链表方法一:回溯解题思路代码classSolution{private:intmx=INT_MIN,mi=INT_MAX;Node*start=NULL,*end=NULL;public:voidLrotate(Node*root,Node*last_root){//针对左子树,左旋if(!ro......
  • 递归-回溯2
    namespaceJD;publicclassJDTest{publicstaticvoidShow(){int[]arr={1,2,3,4,5,6,7};varroot=BuildTree2(arr,0,arr.Length-1);varstack=newStack<int>();varrtList=newList<int>();......
  • PAT Basic 1075. 链表元素分类
    PATBasic1075.链表元素分类1.题目描述:给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而[0,K]区间内的元素都排在大于K的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为18→7→-4→0→5→-6→10→11→-2,K为......
  • HJ67_24点游戏算法_多维递归_DFS(深度优先搜索)
    思路:多维递归,深度有限遍历加减乘除四种情况。知识点:1、多维递归不能对传递的变量进行修改,否则无法回溯。应该传递一个新地址的变量,如代码所示,传递切片的列表,不修改列表  2、搜索遗漏。两括号比如((9-4)-1)*6选取任意一个数作为第一个运算数与24运算,不能找出所有24点的计算......
  • HJ71_字符串通配符_多维递归
    思路:1、对比字符最后一个,对比字符倒数第二个,一致对比到最后一个,如此递归。2、该题符合多维递归,回溯判断。遇到“*”通配符时,列举三种不同参数传递的递归情况,分叉递归以达到穷举的效果。(回溯)3、结束条件:两字符串均为空,不计算“*”字符具体,如代码所示。#*只能匹配数字或字母0个......
  • 链表中的节点每k个一组翻转
    classSolution{publicListNodereverseKGroup(ListNodehead,intk){ListNodedummy=newListNode(0);//定义虚拟节点dummy.next=head;ListNodeprev=dummy;//定义一个前置节点prev,用于保存已经翻转完成的部分的尾部节点......