循环双链表的插入和删除的一些基本操作java版
2015-10-10 09:45
771 查看
package doublelinkedlistwithcycleandsentry;
/*
*双向循环链表的结构
*author yy
* */
public class DNode<T extends Comparable<T>> implements Comparable<DNode<T>> {
private T data;
private DNode<T> pre;
private DNode<T> next;
public DNode(){
}
public DNode(T data){
this.data=data;
this.pre=null;
this.next=null;
}
public DNode(T data, DNode<T> pre, DNode<T> next) {
this.data = data;
this.pre = pre;
this.next = next;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public DNode<T> getPre() {
return pre;
}
public void setPre(DNode<T> pre) {
this.pre = pre;
}
public DNode<T> getNext() {
return next;
}
public void setNext(DNode<T> next) {
this.next = next;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((data == null) ? 0 : data.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DNode other = (DNode) obj;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
return true;
}
@Override
public int compareTo(DNode<T> o) {
return this.data.compareTo(o.getData());
}
}
package doublelinkedlistwithcycleandsentry;
public class DoubleLinkedListWithSentry<T extends Comparable<T>> {
//哨兵
private final DNode<T> sentry=new DNode<T>();
private DNode<T> head;
public DNode<T> getHead() {
return head;
}
public DoubleLinkedListWithSentry(DNode<T> head) {
this.head = head;
}
public DoubleLinkedListWithSentry() {
this.head=sentry;
this.head.setNext(head);
this.head.setPre(head);
}
//插入节点
public void insertData(T data){
DNode<T> element=new DNode<T>(data);
element.setNext(this.head.getNext());
this.head.getNext().setPre(element);
this.head.setNext(element);
element.setPre(head);
}
//插入的位置是从1开始的
public void insertData(T data,int pos){
if(pos<1) return ;
int len=this.size(this.head);
if(pos>len)pos=len;
DNode<T> node=this.head;
DNode<T> element=new DNode<T>(data);
for(int i=1;i<pos;i++){
node=node.getNext();
}
element.setNext(node.getNext());
node.getNext().setPre(element);
node.setNext(element);
element.setPre(node);
}
//删除元素
public boolean deleteData(T data){
DNode<T> node=this.head;
DNode<T> element=new DNode<T>(data);
DNode<T> prenode=null;
while(!node.getNext().equals(this.head)){
prenode=node;
node=node.getNext();
if(node.equals(element)){
prenode.setNext(node.getNext());
node.getNext().setPre(prenode);
node.setNext(null);
node.setPre(null);
node=null;
return true;
}
}
return false;
}
//删除指定位置的元素 第一个元素是从1开始的
public void deleteDataByPos(int pos){
if(pos<1)return ;
int len=this.size(this.head);
if(pos>len)pos=len;
DNode<T> node=this.head;
for(int i=1;i<pos;i++){
node=node.getNext();
}
node.setNext(node.getNext().getNext());
node.getNext().getNext().setPre(node);
}
//循环链表的长度
public int size(){
return this.size(this.head);
}
private int size(DNode<T> head){
DNode<T> node=head.getNext();
int count=0;
while(node!=this.head){
count++;
node=node.getNext();
}
return count;
}
//遍历链表
public void traverse(){
this.traverse(this.head);
}
private void traverse(DNode<T> head){
DNode<T> node=head.getNext();
while(node!=head){
System.out.print(node.getData()+" ");
node=node.getNext();
}
System.out.println();
}
}
/*
*双向循环链表的结构
*author yy
* */
public class DNode<T extends Comparable<T>> implements Comparable<DNode<T>> {
private T data;
private DNode<T> pre;
private DNode<T> next;
public DNode(){
}
public DNode(T data){
this.data=data;
this.pre=null;
this.next=null;
}
public DNode(T data, DNode<T> pre, DNode<T> next) {
this.data = data;
this.pre = pre;
this.next = next;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public DNode<T> getPre() {
return pre;
}
public void setPre(DNode<T> pre) {
this.pre = pre;
}
public DNode<T> getNext() {
return next;
}
public void setNext(DNode<T> next) {
this.next = next;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((data == null) ? 0 : data.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
DNode other = (DNode) obj;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
return true;
}
@Override
public int compareTo(DNode<T> o) {
return this.data.compareTo(o.getData());
}
}
package doublelinkedlistwithcycleandsentry;
public class DoubleLinkedListWithSentry<T extends Comparable<T>> {
//哨兵
private final DNode<T> sentry=new DNode<T>();
private DNode<T> head;
public DNode<T> getHead() {
return head;
}
public DoubleLinkedListWithSentry(DNode<T> head) {
this.head = head;
}
public DoubleLinkedListWithSentry() {
this.head=sentry;
this.head.setNext(head);
this.head.setPre(head);
}
//插入节点
public void insertData(T data){
DNode<T> element=new DNode<T>(data);
element.setNext(this.head.getNext());
this.head.getNext().setPre(element);
this.head.setNext(element);
element.setPre(head);
}
//插入的位置是从1开始的
public void insertData(T data,int pos){
if(pos<1) return ;
int len=this.size(this.head);
if(pos>len)pos=len;
DNode<T> node=this.head;
DNode<T> element=new DNode<T>(data);
for(int i=1;i<pos;i++){
node=node.getNext();
}
element.setNext(node.getNext());
node.getNext().setPre(element);
node.setNext(element);
element.setPre(node);
}
//删除元素
public boolean deleteData(T data){
DNode<T> node=this.head;
DNode<T> element=new DNode<T>(data);
DNode<T> prenode=null;
while(!node.getNext().equals(this.head)){
prenode=node;
node=node.getNext();
if(node.equals(element)){
prenode.setNext(node.getNext());
node.getNext().setPre(prenode);
node.setNext(null);
node.setPre(null);
node=null;
return true;
}
}
return false;
}
//删除指定位置的元素 第一个元素是从1开始的
public void deleteDataByPos(int pos){
if(pos<1)return ;
int len=this.size(this.head);
if(pos>len)pos=len;
DNode<T> node=this.head;
for(int i=1;i<pos;i++){
node=node.getNext();
}
node.setNext(node.getNext().getNext());
node.getNext().getNext().setPre(node);
}
//循环链表的长度
public int size(){
return this.size(this.head);
}
private int size(DNode<T> head){
DNode<T> node=head.getNext();
int count=0;
while(node!=this.head){
count++;
node=node.getNext();
}
return count;
}
//遍历链表
public void traverse(){
this.traverse(this.head);
}
private void traverse(DNode<T> head){
DNode<T> node=head.getNext();
while(node!=head){
System.out.print(node.getData()+" ");
node=node.getNext();
}
System.out.println();
}
}
相关文章推荐
- Java并发编程:阻塞队列
- java int 乘法溢出问题
- Java基础知识强化之集合框架笔记63:Map集合之HashMap嵌套ArrayList
- springmvc简介
- eclipse使用hadoop来统计单词的个数
- Java基础知识强化之集合框架笔记62:Map集合之HashMap嵌套HashMap
- eclipse调试以及各个键的作用
- JAVA基础学习(二十一)--IO流三-File、Properties、PrintWriter与合并、分割流
- JAVA基础学习day21--IO流三-File、Properties、PrintWriter与合并、分割流
- 使用JavaMail发送邮件时判断发送结…
- 解决Java从MySQL读取大量数据时卡…
- 基于Boost线程库实现Java中atomic…
- 怎么在eclipse中打开Android的samp…
- Java中自定义枚举(Enum)项的值及…
- Interface(Java关键字)天然是接…
- Java中条件变量使用示例及性能测试
- 深入理解Java Proxy
- 转载:C, Erlang, Java and Go Web…
- java中的省略参数
- 发现自己土了: java运行时指定虚…