链表
链表分为: 单链表,双链表, 循环链表
下面是:对单链表的回忆:
看看链表的存储模型:线性的
添加过程:
删除过程:
下面具体给点代码:
package 线性.单链表;
public class Node{
private Object value;
private Node next;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(Object value, Node next) {
this.value = value;
this.next = next;
}
public Node(Object value) {
this.value = value;
this.next = null;
}
public Node() {
this.value = null;
this.next = null;
}
}
package 线性.单链表;
public class DireLinkedList {
/**
* true: 是有头结点的链表
* flase: 无头结点的链表
*/
private boolean isHead;
private Node first;
/**
* 无头节点的单链表
*/
public DireLinkedList(Node first) {
this.first = first;
isHead=(first== null)? true: false;
}
/**
* 有头节点的单链表
*/
public DireLinkedList() {
first= new Node();
isHead= true;
}
public DireLinkedList(DireLinkedList dll) {
this.isHead=dll.isHead;
this.first=dll.first;
}
/**
* 在index后面添加一个新的节点到链表中
* 返回是否添加成功
* @return
*/
public void add(Object value, int index){
if(index==1){
this.addFirst(value);
} else{
Node node = this.get(index-1);
Node nextNode = node.getNext();
node.setNext( new Node(value,nextNode));
}
}
/**
* 在最后插入
* @param index
* @return
*/
public void addLast(Object value){
Node node=first; //存放当前最后节点
while(node.getNext()!= null){
node=node.getNext();
}
node.setNext( new Node(value));
}
/**
* 在第一个位置插入
* @param index
*
*/
public void addFirst(Object value){
if(isHead){ //如果有头节点
first.setNext( new Node(value,first.getNext()));
} else{
first= new Node( new Node(value,first));
}
}
/**
* 是否包含 值为value的节点
* @param value
* @return
*/
public boolean contain(Object value){
Node temp; //获取第一个元素
temp=isHead?first.getNext():first;
while(temp!= null){
if(temp.getValue().equals(value)) return true;
temp=temp.getNext();
}
return false;
}
/**
* 返回 所有的值
* @return
*/
public Object[] getValues(){
Object []results= new Object[size()];
int index=0;
Node temp;
temp=isHead?first.getNext():first;
while(temp!= null){
results[index++]=temp.getValue();
temp=temp.getNext();
}
return results;
}
/**
* 获取指定下面元素
* @param index 索引
* @return
*/
public Node get( int index){
try{
if(index<=0||index>size()){
throw new Exception( "the index out of the rang of size!!");
} else{
int i=0;
Node temp; //获取第一个元素
temp=isHead?first.getNext():first;
while(temp!= null){
if(++i==index) return temp;
temp=temp.getNext();
}
}
} catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 获取指定下面元素
* @param index 索引
* @return
*/
public Object getValue( int index){
try{
if(index<=0||index>size()){
throw new Exception( "the index out of the rang of size!!");
} else{
int i=0;
Node temp; //获取第一个元素
temp=isHead?first.getNext():first;
while(temp!= null){
if(++i==index) return temp.getValue();
temp=temp.getNext();
}
}
} catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 返回链表长度
*/
public int size(){
Node node=first;
int size=1;
while(node.getNext()!= null) {
size++;
node=node.getNext();
}
if(isHead) size--;
return size;
}
/**
* 如果存在 并且 移除返回true
* 如果不存在 或者 没有不存在返回false
* @param value
* @return
*/
public boolean removeFirst(Object value){
if( this.contain(value)){
Node temp;
temp=isHead?first.getNext():first;
Node pre=temp;
while(temp!= null){
if(temp.getValue().equals(value)){
/**
* 移除
*/
if(temp==pre){ //说明是第一个
this.remove(1);
} else{
pre.setNext(temp.getNext());
}
pre= null;
break;
} else{
pre=temp;
}
temp=temp.getNext();
}
return true;
} else return false;
}
/**
* 如果存在 并且 移除返回true
* 如果不存在 或者 没有不存在返回false
* @param value
* @return
*/
public boolean removeAll(Object value){
if( this.contain(value)){
Node temp;
temp=isHead?first.getNext():first;
Node pre=temp;
while(temp!= null){
if(temp.getValue().equals(value)){
if(temp==pre){ //说明是第一个
this.remove(1);
} else{
pre.setNext(temp.getNext());
}
} else{
pre=temp;
}
temp=temp.getNext();
}
pre= null;
return true;
} else return false;
}
/**
* 删除第i个节点
*/
@SuppressWarnings( "uncheck")
public boolean remove( int i){
Node node ;
try{
if(i<=0||i>size()){
throw new Exception( "the index out of the rang of size!!");
} else if(i==1){
if(isHead){
node=first.getNext();
first.setNext(node.getNext());
node= null;
} else{
node=first;
first.setNext(node.getNext());
node= null;
}
} else{
Node node1= this.get(i-1);
Node node2= this.get(i+1);
node1.setNext(node2);
Node currentNode= this.get(i);
currentNode= null; //释放当前节点
}
} catch(Exception e){
e.printStackTrace();
}
return false;
}
/**
* 替换掉第I个节点
*/
public void replace( int i,Object value){
Node node= this.get(i);
node.setValue(value);
}
/**
* 替换掉第I个节点
*/
public void replace(Object current,Object value){
Node temp=isHead?first.getNext():first;
while(temp!= null){
if(temp.getValue().equals(current)){
temp.setValue(value);
break;
}
temp=temp.getNext();
}
}
/**
*
* @param current 当前值
* @param value 替换后的值
* @return 如果一个也没有找到返回false 否则返回true
*/
public void replaceAll(Object current,Object value){
Node temp=isHead?first.getNext():first;
while(temp!= null){
if(temp.getValue().equals(current)){
temp.setValue(value);
}
temp=temp.getNext();
}
}
public boolean isHead() {
return isHead;
}
public void setHead( boolean isHead) {
this.isHead = isHead;
}
public Node getFirst() {
return first;
}
public void setFirst(Node first) {
this.first = first;
}
}
public class Node{
private Object value;
private Node next;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(Object value, Node next) {
this.value = value;
this.next = next;
}
public Node(Object value) {
this.value = value;
this.next = null;
}
public Node() {
this.value = null;
this.next = null;
}
}
package 线性.单链表;
public class DireLinkedList {
/**
* true: 是有头结点的链表
* flase: 无头结点的链表
*/
private boolean isHead;
private Node first;
/**
* 无头节点的单链表
*/
public DireLinkedList(Node first) {
this.first = first;
isHead=(first== null)? true: false;
}
/**
* 有头节点的单链表
*/
public DireLinkedList() {
first= new Node();
isHead= true;
}
public DireLinkedList(DireLinkedList dll) {
this.isHead=dll.isHead;
this.first=dll.first;
}
/**
* 在index后面添加一个新的节点到链表中
* 返回是否添加成功
* @return
*/
public void add(Object value, int index){
if(index==1){
this.addFirst(value);
} else{
Node node = this.get(index-1);
Node nextNode = node.getNext();
node.setNext( new Node(value,nextNode));
}
}
/**
* 在最后插入
* @param index
* @return
*/
public void addLast(Object value){
Node node=first; //存放当前最后节点
while(node.getNext()!= null){
node=node.getNext();
}
node.setNext( new Node(value));
}
/**
* 在第一个位置插入
* @param index
*
*/
public void addFirst(Object value){
if(isHead){ //如果有头节点
first.setNext( new Node(value,first.getNext()));
} else{
first= new Node( new Node(value,first));
}
}
/**
* 是否包含 值为value的节点
* @param value
* @return
*/
public boolean contain(Object value){
Node temp; //获取第一个元素
temp=isHead?first.getNext():first;
while(temp!= null){
if(temp.getValue().equals(value)) return true;
temp=temp.getNext();
}
return false;
}
/**
* 返回 所有的值
* @return
*/
public Object[] getValues(){
Object []results= new Object[size()];
int index=0;
Node temp;
temp=isHead?first.getNext():first;
while(temp!= null){
results[index++]=temp.getValue();
temp=temp.getNext();
}
return results;
}
/**
* 获取指定下面元素
* @param index 索引
* @return
*/
public Node get( int index){
try{
if(index<=0||index>size()){
throw new Exception( "the index out of the rang of size!!");
} else{
int i=0;
Node temp; //获取第一个元素
temp=isHead?first.getNext():first;
while(temp!= null){
if(++i==index) return temp;
temp=temp.getNext();
}
}
} catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 获取指定下面元素
* @param index 索引
* @return
*/
public Object getValue( int index){
try{
if(index<=0||index>size()){
throw new Exception( "the index out of the rang of size!!");
} else{
int i=0;
Node temp; //获取第一个元素
temp=isHead?first.getNext():first;
while(temp!= null){
if(++i==index) return temp.getValue();
temp=temp.getNext();
}
}
} catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 返回链表长度
*/
public int size(){
Node node=first;
int size=1;
while(node.getNext()!= null) {
size++;
node=node.getNext();
}
if(isHead) size--;
return size;
}
/**
* 如果存在 并且 移除返回true
* 如果不存在 或者 没有不存在返回false
* @param value
* @return
*/
public boolean removeFirst(Object value){
if( this.contain(value)){
Node temp;
temp=isHead?first.getNext():first;
Node pre=temp;
while(temp!= null){
if(temp.getValue().equals(value)){
/**
* 移除
*/
if(temp==pre){ //说明是第一个
this.remove(1);
} else{
pre.setNext(temp.getNext());
}
pre= null;
break;
} else{
pre=temp;
}
temp=temp.getNext();
}
return true;
} else return false;
}
/**
* 如果存在 并且 移除返回true
* 如果不存在 或者 没有不存在返回false
* @param value
* @return
*/
public boolean removeAll(Object value){
if( this.contain(value)){
Node temp;
temp=isHead?first.getNext():first;
Node pre=temp;
while(temp!= null){
if(temp.getValue().equals(value)){
if(temp==pre){ //说明是第一个
this.remove(1);
} else{
pre.setNext(temp.getNext());
}
} else{
pre=temp;
}
temp=temp.getNext();
}
pre= null;
return true;
} else return false;
}
/**
* 删除第i个节点
*/
@SuppressWarnings( "uncheck")
public boolean remove( int i){
Node node ;
try{
if(i<=0||i>size()){
throw new Exception( "the index out of the rang of size!!");
} else if(i==1){
if(isHead){
node=first.getNext();
first.setNext(node.getNext());
node= null;
} else{
node=first;
first.setNext(node.getNext());
node= null;
}
} else{
Node node1= this.get(i-1);
Node node2= this.get(i+1);
node1.setNext(node2);
Node currentNode= this.get(i);
currentNode= null; //释放当前节点
}
} catch(Exception e){
e.printStackTrace();
}
return false;
}
/**
* 替换掉第I个节点
*/
public void replace( int i,Object value){
Node node= this.get(i);
node.setValue(value);
}
/**
* 替换掉第I个节点
*/
public void replace(Object current,Object value){
Node temp=isHead?first.getNext():first;
while(temp!= null){
if(temp.getValue().equals(current)){
temp.setValue(value);
break;
}
temp=temp.getNext();
}
}
/**
*
* @param current 当前值
* @param value 替换后的值
* @return 如果一个也没有找到返回false 否则返回true
*/
public void replaceAll(Object current,Object value){
Node temp=isHead?first.getNext():first;
while(temp!= null){
if(temp.getValue().equals(current)){
temp.setValue(value);
}
temp=temp.getNext();
}
}
public boolean isHead() {
return isHead;
}
public void setHead( boolean isHead) {
this.isHead = isHead;
}
public Node getFirst() {
return first;
}
public void setFirst(Node first) {
this.first = first;
}
}