public interface IList {
public void addStart(int val);
public void addLast(int val);
public void display();
public Boolean isContain(int val);
public void addIndex(int key,int val);
public void remove(int val);
public void removeAllval(int val);
}
单链表顾名思义就是只有一个方向的链表。
单链表的实现:
1.先确定链表中有什么?答:节点。//可以使用内部类的方式定义。
2.确定链表中有什么域,我们先简单的给予其值域val,指针域next。
3.确定链表中要实现的方法。//可以定义一个接口。
4.最终在测试类中串联实现你想干的事。
如下面代码:
注意:
1.void addstart(int val); 为头插入法
2.void addlast(int val); 为尾部插入法
3.void display(); 打印链表中的val值
4.Boolean isContained(int val) 判断链表中是否存在val这个值
5.void addIndex(int key,int val) 在第key个数中插入val值的结点
第五个方法要重点注意一下,当key==0时要调用addstart方法。当key==length()-1时要调用addlast方法。同时也要判断key的值是否合法
6.void remove(int val) 删除链表中第一次出现和val值相等的结点
7.void removeAllval 删除链表中所有与val值相等的结点
8.int length() 计算链表的长度
public class Test {
public static void main(String[] args) {
MysigleList List=new MysigleList();
List.addStart(3);
List.addStart(4);
List.addStart(5);
List.addStart(6);
List.addStart(0);
List.addStart(0);
List.display();
System.out.println("==============");
List.addIndex(1,10);
List.display();
System.out.println("================");
List.addIndex(0,1);
List.display();
System.out.println("==============");
List.remove(0);
List.display();
System.out.println("===========");
List.removeAllval(0);
List.display();
}
}
public interface IList {
public void addStart(int val);
public void addLast(int val);
public void display();
public Boolean isContain(int val);
public void addIndex(int key,int val);
public void remove(int val);
public void removeAllval(int val);
}
public class MysigleList implements IList{
static class Listnode{
public int val;
public Listnode next;
public Listnode(int val) {
this.val = val;
}
}
public Listnode head;
public void addStart(int val){
Listnode cur=new Listnode(val);
cur.next=this.head;
head=cur;
}
public void addLast(int val){
Listnode cur=head;
while(cur.next!=null){
cur=cur.next;
}
Listnode node=new Listnode(val);
cur.next=node;
node.next=null;
}
public void display(){
Listnode cur=head;
while(cur!=null){
System.out.println(cur.val);
cur=cur.next;
}
}
public Boolean isContain(int val){
Listnode cur=head;
while(cur!=null) {
if (cur.val == val) {
return true;
}
cur=cur.next;
}
return false;
}
public void addIndex(int key,int val){
Listnode cur=head;
if(key<0||key>=Listlength()){
return;
}
if(key==0){
addStart(val);
return;
}
if(key==Listlength()-1){
addLast(val);
return;
}
while(key-1>0){
cur=cur.next;
key--;
}
Listnode node=new Listnode(val);
node.next=cur.next;
cur.next=node;
}
private int Listlength(){
Listnode cur=head;
if(head==null){
return -1;
}
int count=0;
while(cur!=null){
count++;
cur=cur.next;
}
return count;
}
public void remove(int val){
Listnode cur=head;
if(head==null){
return;
}
while(cur.next!=null){
if(head.val==val){
head=cur.next;
return;
}
if(cur.next.val==val){
cur.next=cur.next.next;
cur=cur.next;
return;
}
cur=cur.next;
}
System.out.println("链表中未找到该数!!!!");
}
public void removeAllval(int val){
Listnode cur=head;
if(head==null){
return;
}
while(cur.next!=null){
if(head.val==val){
head=cur.next;
}
if(cur.next.val==val){
cur.next=cur.next.next;
}
cur=cur.next;
}
}
}
双向链表顾名思义就是有两个方向。
双链表的实现:
1.双链表中有三个域,分别是值域,next域(指向下一个结点),prev域(指向上一个结点)。
2.确定链表中要实现的方法。//可以定义一个接口。
3.最终在测试类中串联实现你想干的事。
如下列代码:
public interface IList {
public void addStart(int val);
public void addLast(int val);
public void display();
public Boolean isContain(int val);
public void addIndex(int key,int val);
public void remove(int val);
public void removeAllval(int val);
}
public class Test {
public static void main(String[] args) {
LinkedList List=new LinkedList();
List.addLast(5);
List.addLast(4);
List.addLast(3);
List.addLast(2);
List.addLast(1);
List.addLast(8);
List.display();
System.out.println(List.isContain(0));
List.addIndex(1,8);
List.display();
System.out.println("+=========");
List.remove(8);
List.display();
System.out.println("============");
List.removeAllval(8);
List.display();
}
}
public class LinkedList implements IList{
static class Listnode{
public int val;
public Listnode prev;
public Listnode next;
public Listnode(int val) {
this.val = val;
}
}
public Listnode head;
public Listnode last;
public void addStart(int val){
Listnode cur=new Listnode(val);
if(head==null){
head=last=cur;
}else{
cur.next=head;
head.prev=cur;
head=cur;
}
}
public void addLast(int val){
Listnode cur=new Listnode(val);
if(last==null){
head=last=cur;
}else{
cur.prev=last;
last.next=cur;
last=cur;
}
}
public void display(){
Listnode cur=head;
while(cur!=null){
System.out.println(cur.val+" ");
cur=cur.next;
}
}
public Boolean isContain(int val){
Listnode cur=head;
while(cur!=null){
if(cur.val==val){
return true;
}
cur=cur.next;
}
return false;
}
public void addIndex(int key,int val){
Listnode cur=head;
Listnode node=new Listnode(val);
if(key<0||key>Listlength()-1){
return;
}
if(key==0){
addStart(val);
return;
}
if(key==Listlength()-1){
addLast(val);
return;
}
while(key>0){
cur=cur.next;
key--;
}
cur.prev.next=node;
node.prev=cur.prev;
cur.prev=node;
node.next=cur;
}
private int Listlength(){
LinkedList.Listnode cur=head;
if(head==null){
return -1;
}
int count=0;
while(cur!=null){
count++;
cur=cur.next;
}
return count;
}
public void remove(int val){
Listnode cur=head;
Listnode end=last;
while(cur!=null){
if(head.val==val){
head=head.next;
if(head!=null){
head.prev=null;
}
return;
}
if(last.val==val){
last=last.prev;
last.next=null;
return;
}
if (cur.val == val) {
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
return;
}
cur=cur.next;
}
}
public void removeAllval(int val){
Listnode cur=head;
Listnode end=last;
while(cur!=null){
if(head.val==val){
head=head.next;
if(head!=null){
head.prev=null;
}
}
if(last.val==val){
last=last.prev;
last.next=null;
}
if (cur.val == val) {
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
}
cur=cur.next;
}
}
}