package com.project.common.core.absclasses; import com.project.common.utils.StringUtils; import lombok.Data; import java.util.ArrayList; import java.util.List; @Data public class BaseLink { private BaseLinkNode head; public void add(T t) { if (StringUtils.isNull(head)){ head = new BaseLinkNode<>(); head.setData(t); } else { BaseLinkNode last = getLast(head); BaseLinkNode newLast = new BaseLinkNode<>(); newLast.setData(t); newLast.setPre(last); last.setSuf(newLast); } } public BaseLinkNode getAndRemoveByHead(BaseLink link) { BaseLinkNode node = link.head; BaseLinkNode suf = node.getSuf(); suf.setPre(null); head = suf; return node; } public BaseLinkNode getAndRemoveByLast(BaseLink link) { BaseLinkNode last = getLast(link.head); BaseLinkNode newLast = last.getPre(); newLast.setSuf(null); newLast.setPre(last.getPre()); return last; } private BaseLinkNode getLast(BaseLinkNode link) { if (!link.getHasSuf()){ return link; } return getLast(link.getSuf()); } private BaseLinkNode getHead(BaseLinkNode link) { if (!link.getHasPre()){ return link; } return getHead(link.getPre()); } private List> getAllNodeByHead(BaseLink link) { if (StringUtils.isNull(link.head)){ return null; } ArrayList> ts = new ArrayList<>(); BaseLinkNode current = link.head; while (true){ ts.add(current); if (current.getHasSuf()){ current = current.getSuf(); } else { break; } } return ts; } private List> getAllNodeByLast(BaseLink link) { if (StringUtils.isNull(link.head)){ return null; } BaseLinkNode current = getLast(link.head); ArrayList> ts = new ArrayList<>(); while (true){ ts.add(current); if (current.getHasPre()){ current = current.getPre(); } else { break; } } return ts; } }