一.链表带哨兵
import java.util.Iterator;
import java.util.function.Consumer;
//带哨兵
public class shuju02 implements Iterable<Integer> {//整体
private Node head=new Node(666,null);//头指针
@Override
public Iterator<Integer> iterator() {
//匿名内部类->带名字的内部类
return new NodeIterator();
}
private class NodeIterator implements Iterator<Integer> {
Node p=head.next;
@Override
public boolean hasNext() {//是否有下一个元素
return p!=null;//不空返回真
}
@Override
public Integer next() {//返回当前值,并指向下一个元素
int v=p.value;
p=p.next;
return v;
}
}
private static class Node {
int value;//值
Node next;//下一个节点指针
public Node(int value, Node next) {
this.value = value;
this.next = next;
}
}
public void addFirst(int value) throws IllegalAccessException {
//1.链表为空
// head=new Node(value,null);
//2.链表非空(头插)
/* head = new Node(value, head);*/
insert(0,value);
}
//遍历链表
//Params:consumer-要执行的操作
public void loop(Consumer<Integer> consumer) {
Node p = head;
while (p != null) {
consumer.accept(p.value);
p = p.next;
}
}
//遍历链表2
//Params:consumer-要执行的操作
public void loop2(Consumer<Integer> consumer) {
for (Node p = head; p != null; p = p.next){
consumer.accept(p.value);
}
}
//遍历链表3(递归遍历)
//Params:consumer-要执行的操作
public void loop3(Consumer<Integer>before,//没有哨兵
Consumer<Integer>after){
recursion(head,before,after);
}
private void recursion(Node curr,//当前节点
Consumer<Integer>before,Consumer<Integer>after){//某个节点要进行的操作
if(curr==null){
return;
}
before.accept(curr.value);
recursion(curr.next,before,after);//放前边倒叙,放后面顺序->指这句话
after.accept(curr.value);
}
private Node findLast(){
Node p;
for(p=head;p.next!=null;p=p.next){
}
return p;
}
public void addLast(int value){
Node last=findLast();
last.next=new Node(value,null);
}
/* public void test(){
int i=0;
for(Node p=head;p!=null;p=p.next,i++){
System.out.println(p.value+"索引是:"+i);
}
根据索引查找
Params:index-索引
Returns:找到,返回该索引位置节点的值
Throws:IlLegalArgumentException-找不到,抛出index非法异常
}*/
private Node findNode(int index){//给定索引位置
int i=-1;
for(Node p=head ;p!=null;p=p.next,i++){
if(i==index){
return p;
}
}
return null;//没找到
}
public int get(int index) throws IllegalAccessException {
Node node=findNode(index);
if(node==null){
//抛异常
illegalIndex(index);
}
return node.value;
}
//异常处理(重点)
private static void illegalIndex(int index) throws IllegalAccessException {
throw new IllegalAccessException(
String.format("index[%d] 不合法%n", index)
);
}
/*
向索引位置插入
*/
public void insert(int index,int value) throws IllegalAccessException {
Node prev=findNode(index-1);//找到上一个节点
if(prev==null){
illegalIndex(index);
}
prev.next=new Node(value,prev.next);
}
//1.问题
//删除头节点
public void removeFirst() throws IllegalAccessException {
remove(0);
}
public void remove(int index) throws IllegalAccessException {
Node prev=findNode(index-1);//上一个节点
if(prev==null){
illegalIndex(index);
}
Node removed=prev.next;//被删除的节点
if(removed==null){
illegalIndex(index);
}
prev.next=removed.next;
}
}
二.双向链表带哨兵
import java.util.Iterator;
//双向链表,带哨兵
public class shuju03 implements Iterable<Integer>{
static class Node{
Node prev;//上一个节点指针
int value;
Node next;//下一个节点指针
public Node(Node prev, int value, Node next) {
this.prev = prev;
this.value = value;
this.next = next;
}
}
private Node head;//头哨兵
private Node tail;//尾哨兵
public shuju03(){
head=new Node(null,666,null);
tail=new Node(null,666,null);
head.next=tail;
tail.prev=head;
}
private Node findNode(int index){
int i=-1;
for(Node p=head;p!=tail;p=p.next,i++){
if(i==index){
return p;
}
}
return null;
}
public void addFirst(int value) throws IllegalAccessException {
insert(0,value);
}
public void removeLast() throws IllegalAccessException {
Node removed=tail.prev;
if(removed==head){
illegalIndex(0);
}
Node prev=removed.prev;
prev.next=tail;
tail.prev=prev;
}
public void addLast(int value){
Node last=tail.prev;
Node added=new Node(last,value,tail);
last.next=added;
tail.prev=added;
}
public void insert(int index,int value) throws IllegalAccessException {
Node prev=findNode(index-1);
if(prev==null){
illegalIndex(index);
}
Node next=prev.next;
Node inserted=new Node(prev,value,next);
prev.next=inserted;
next.prev=inserted;
}
public void remove(int index) throws IllegalAccessException {
Node prev=findNode(index-1);
if(prev==null){
illegalIndex(index);
}
Node removed=prev.next;
if(removed==tail){
illegalIndex(index);
}
Node next=removed.next;
prev.next=next;
next.prev=prev;
}
private static void illegalIndex(int index) throws IllegalAccessException {
throw new IllegalAccessException(
String.format("index[%d] 不合法%n", index)
);
}
@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
Node p=head.next;
@Override
public boolean hasNext() {
return p!=tail;
}
@Override
public Integer next() {
int value=p.value;
return value;
}
};
}
}
三.双向链表
import java.util.Iterator;
public class shuju04 implements Iterable<Integer> {
@Override
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
Node p=sentinel.next;
@Override
public boolean hasNext() {
return p!=sentinel;
}
@Override
public Integer next() {
int value= p.value;
p=p.next;
return value;
}
};
}
/*
s->1->2->3->1->s
*/
private static class Node{
Node prev;
int value;
Node next;
public Node(Node prev, int value, Node next) {
this.prev = prev;
this.value = value;
this.next = next;
}
}
private Node sentinel=new Node(null,-1,null);
public shuju04(){
sentinel.prev=sentinel;
sentinel.next=sentinel;
}
//添加到第一个
//Params value-待添加值
public void addFirst(int value){
Node a=sentinel;
Node b=sentinel.next;
Node added=new Node(a,value,b);
a.next=added;
b.prev=added;
}
//添加到最后一个
//Params:value-待添加值
public void addLast(int value){
Node a=sentinel.prev;
Node b=sentinel;
Node added=new Node(a,value,b);
a.next=added;
b.prev=added;
}
//删除第一个
public void removeFirst() {
Node removed=sentinel.next;
if(removed==sentinel){
throw new IllegalArgumentException("非法");
}
Node a=sentinel;
Node b=removed.next;
a.next=b;
b.prev=a;
}
//删除最后一个
public void removeLast(){
Node removed=sentinel.prev;
if(removed==sentinel){
throw new IllegalArgumentException("非法");
}
Node a=removed.prev;
Node b=sentinel;
a.next=b;
b.prev=a;
}
//根据值删除
// Params:value-目标值
public void removeByValue(int value){
Node removed=findByValue(value);
if(removed==null){
return;//不用删
}
Node a=removed.prev;
Node b=removed.next;
a.next=b;
b.prev=a;
}
private Node findByValue(int value){
Node p=sentinel.next;
while(p!=sentinel){
if(p.value==value){
return p;
}
p=p.next;
}
return null;
}
}
标签:Node,prev,int,value,next,链表,哨兵,数据结构,public
From: https://www.cnblogs.com/cgy-chen/p/17548890.html