实现基础的单链表及链表反转
public class Node<T> {private T data;private Node<T> next;public Node(T data, Node<T> next) {this.data = data;this.next = next;}public T getData() {return data;}public void setData(T data) {this.data = data;}public Node<T> getNext() {return next;}public void setNext(Node<T> next) {this.next = next;}}
public class SingleLinkedList<T> {private int size;private Node<T> head;/*** 添加* @param v*/public void add(T v){if(size>0){Node<T> node=new Node<>(v,null);Node lastNode = getLastNode();if(lastNode!=null){lastNode.setNext(node);size++;}}else {if(head==null){head=new Node<>(v,null);}else {head.setData(v);}size++;}}public SingleLinkedList(){size=0;head=new Node<>(null,null);}/*** 具体位置添加* @param position* @param v*/public void insert(int position, T v){if(position>=0 && position<size){Node insertNode=new Node(v,null);Node node=head;Node pre=null;if(position==0){insertNode.setNext(head);head=insertNode;size++;}else {for(int x=0;x<position;x++){pre=node;node=node.getNext();}pre.setNext(insertNode);insertNode.setNext(node);size++;}}}/*** 删除指定位置* @param position* @return*/public T remove(int position){if(position>=0 && position<size){Node<T> node=head;Node<T> pre=null;Node<T> next=null;T value=null;if(position==0){value= node.getData();node= node.getNext();head.setNext(null);head.setData(null);head=node;size--;}else {for(int x=0;x<position;x++){//找到删除的节点pre=node;//当前要删除的上个节点node=node.getNext();//当前节点next=node.getNext();//当前需要删除的下个节点}value= (T) node.getData();node.setNext(null);node.setData(null);node=null;pre.setNext(next);size--;}return value;}return null;}/*** 获取指定位置节点* @param position* @return*/public Node getNode(int position){if(position>=0 && position<size){Node node=head;for(int x=0;x<position;x++){node=node.getNext();}return node;}else {return null;}}public Node getHead(){return head;}/*** 获取最后一个节点* @return*/public Node getLastNode(){Node node=head;while (node !=null && node.getNext()!=null){node= node.getNext();}return node;}/*** 清空*/public void clear(){for (int x=0;x<size;x++){Node next=head.getNext();head.setNext(null);head.setData(null);head= next;}size=0;}/*** 查看第一个元素的数据* @return*/public T peek(){if(size>0 && head!=null){return head.getData();}return null;}/*** 反转打印*/public Node reversal(){if (head == null){return head;}Node node=head;Node pre=null;Node cur=node;Node next=node.getNext();//1->2->3->4->5while (next!=null){next=cur.getNext();//记录当前节点的下一个节点cur.setNext(pre);//将当前节点的下一个节点指向当前节点的上一个节点//交换位置pre=cur;//前一个节点后移到当前节点cur=next;//当前节点设置成后一个节点}return pre;}/*** 正序打印*/public void print(Node n){Node<T> node=n;while (node!=null){String data = (String) node.getData();System.out.println("data:"+data);node=node.getNext();}}public boolean isEmpty(){if(size==0 ){return true;}return false;}public int getSize(){return size;}}
双链表实现及反转
public class DoublyLinkedList<V> {private Node<V> first;private Node<V> last;private int size;public static class Node<V>{V data;Node<V> pre;Node<V> next;public Node(V data, Node<V> pre, Node<V> next) {this.data = data;this.pre = pre;this.next = next;}public Node<V> getPre() {return pre;}public void setPre(Node<V> pre) {this.pre = pre;}public Node<V> getNext() {return next;}public void setNext(Node<V> next) {this.next = next;}public V getData() {return data;}public void setData(V data) {this.data = data;}}public void add(V e){Node<V> l=last;Node<V> newNode=new Node<>(e,l,null);last=newNode;if(l==null){first=newNode;}else {l.next = newNode;}size++;}/*** 反转*/public Node<V> reversal(){if(first!=null){Node<V> node=first;Node<V> pre=null;Node<V> cur=node;Node<V> next=cur.getNext();while (next!=null){next=cur.getNext();cur.setNext(pre);cur.setPre(next);pre=cur;cur=next;}return pre;}return null;}/*** 具体位置添加* @param position* @param v*/public void insert(int position, V v){if(position>=0 && position<size){Node pre=null;if(position==0){// Node node=first;Node insertNode=new Node(v,null,first);first.setPre(insertNode);first=insertNode;size++;}else {Node insertNode=new Node(v,null,null);Node node=first;for(int x=0;x<position;x++){pre=node;node=node.getNext();}pre.setNext(insertNode);insertNode.setPre(pre);insertNode.setNext(node);node.setPre(insertNode);size++;}}}/*** 删除指定位置* @param position* @return*/public V remove(int position){if(position>=0 && position<size){Node<V> node=first;Node<V> pre=null;Node<V> next=null;V value=null;if(position==0){value= node.getData();node= node.getNext();first.setNext(null);first.setData(null);first=node;size--;}else {for(int x=0;x<position;x++){//找到删除的节点pre=node;//当前要删除的上个节点node=node.getNext();//当前节点next=node.getNext();//当前需要删除的下个节点}value= (V) node.getData();node.setNext(null);node.setData(null);node.setPre(null);node=null;pre.setNext(next);next.setPre(pre);size--;}return value;}return null;}/*** 获取指定位置节点* @param position* @return*/public Node<V> getNode(int position){if(position>=0 && position<size){Node<V> node=first;for(int x=0;x<position;x++){node=node.getNext();}return node;}else {return null;}}public boolean isEmpty(){if(size==0 ){return true;}return false;}public int getSize(){return size;}/*** 查看第一个元素的数据* @return*/public V peek(){if(size>0 && first!=null){return first.getData();}return null;}/*** 清空**/public void clear(){while (first!=null){Node<V> next=first.getNext();first.setNext(null);first.setData(null);first.setPre(null);first= next;}size=0;}public void print(){Node<V> node=first;while (node !=null){System.out.println("data="+node.getData());node=node.getNext();}}public void print2(Node<V> node){while (node !=null){System.out.println("data2="+node.getData());node=node.getNext();}}}
