赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
我是学c++的。在学校选课,想着学完了c的数据结构来学java。结果发现,java语法忘了差不多的。如果学弟学妹要面临选择,一定要先决定自己选择的方向,先别急着学完所有的语言。学精一门语言非常地重要!!!
提示:以下是本篇文章正文内容,下面案例可供参考
本篇博客将提供以下功能的代码:
废话不多说,直接上代码
链表接口
//提供链表接口 public abstract interface LList<T> { //将线性表清空 void clear(); //判断线性表是否为空 boolean isEmpty(); //返回线性表的长度 int size(); //返回第i个元素 T get(int i); //设置第i个元素值为x void set(int i,T x); //插入x作为第i个元素 void add(int i,T x); //直接尾插 void add(T x); //删除第i个元素并返回被删除对象 T remove(int i); //查找,返回首次出现的关键字为key的元素 int indexof(T x); }
链表结点类
//创建结点类 public class Node<T> { T data; //Java内没有指针的定义 //Java的引用是指向一个对象,它是占一个新内存的; //而C++的引用则是指向同一个内存的另外一个名字,也就是常说的别名。 Node<T> next; public Node(T data,Node next) { this.data=data; this.next=next; } public Node(T data) { this.data=data; this.next=null; } public Node() { this.data=null; this.next=null; } }
链表实现类
//创建带头节点的单向链表 public class SLinkedList<T> implements LList<T> { private Node<T> head=new Node<T>(); //单链表怎么清空? @Override public void clear() { this.head.next=null; } @Override public boolean isEmpty() { return this.head.next==null; } @Override public int size() { assert(!this.isEmpty()); int size=0; Node<T> tmp=this.head.next; while(tmp!=null) { size++; tmp=tmp.next; } return size; } @Override public T get(int i) { assert(!this.isEmpty()); Node<T> ret=new Node<>(); //判断是否合法 if(i>=1&&i<=this.size()) { Node<T> tmp=this.head; //找到第i个位置前的一个结点 for(int j=1;j<=i-1;j++) { tmp=tmp.next; } ret=tmp.next; } return ret.data; } @Override public void set(int i, T x) { assert(!this.isEmpty()); //判断是否合法 if(i>=1&&i<=this.size()) { Node<T> tmp=this.head; //找到第i个位置前的一个结点 for(int j=1;j<=i-1;j++) { tmp=tmp.next; } tmp.next.data=x; } } //表示在第几位插入 @Override public void add(int i, T x) { Node<T> newnode=new Node<>(x,null); //链表为空 if(this.head.next==null) { this.head.next=newnode; } //链表不为空 else { //判断是否合法 if(i>=1&&i<=this.size()) { Node<T> tmp=this.head; //找到第i个位置前的一个结点 for(int j=1;j<=i-1;j++) { tmp=tmp.next; } newnode.next=tmp.next; tmp.next=newnode; } } } @Override public void add(T x){ Node<T> newnode=new Node<>(x,null); //链表为空 if(this.head.next==null) { this.head.next=newnode; } else { Node<T> tmp=this.head; while(tmp.next!=null) { tmp=tmp.next; } tmp.next=newnode; } } @Override public T remove(int i) { assert(!this.isEmpty()); Node<T> ret=new Node<>(); //判断是否合法 if(i>=1&&i<=this.size()) { Node<T> tmp=this.head; //找到第i个位置前的一个结点 for(int j=1;j<=i-1;j++) { tmp=tmp.next; } ret=tmp.next; tmp.next=tmp.next.next; } return ret.data; } //查找,返回首次出现的关键字为key的元素 @Override public int indexof(T x) { assert(!this.isEmpty()); for(int j=1;j<=this.size();j++) { if(this.get(j)==x) { return j; } } return -1; } //实现单链表的逆转 public void reverse() { if(!this.isEmpty()) { Node<T> prev=new Node<>(); Node<T> cur=this.head.next; Node<T> next=new Node<>(); while(cur!=null) { next=cur.next; cur.next=prev; prev=cur; cur=next; } this.head.next=prev; } } }
顺序表的实现类
public class SeqList<T> implements LList<T> { private Object arr[]; private int len=0; private int capacity=4; //构造函数 //无参 SeqList() { this.arr=new Object[capacity]; } //有参 SeqList(int newcapacity) { this.arr=new Object[newcapacity]; } //清空顺序表 @Override public void clear() { Object obj[]=new Object[4]; this.arr=obj; } @Override public boolean isEmpty() { return this.len==0; } @Override public int size() { return this.len; } //返回第i个元素 @Override public T get(int i) { assert(!this.isEmpty()); //判断下标是否合法 if(i>=0&&i<this.len) return (T) this.arr[i]; else return null; } @Override public void set(int i, T x) { assert(!this.isEmpty()); if(i>=0&&i<this.len) this.arr[i]=x; } //从某一特定位置插入元素 @Override public void add(int i, T x) { //1.考虑增容 if(++this.len==this.capacity) { int newcapacity=capacity*2; Object obj[]=new Object[newcapacity]; for(int j=0;j<this.len;j++) obj[j]=this.arr[j]; this.arr=obj; this.capacity=newcapacity; } //2.找到特点位置进行插入 //从后往前地插入 for(int j=this.len-2;j>=i;j--) { this.arr[j+1]=this.arr[j]; } this.arr[i]=x; } //直接尾插 @Override public void add(T x) { //1.考虑增容 if(this.len==this.capacity) { int newcapacity=capacity*2; Object obj[]=new Object[newcapacity]; for(int i=0;i<this.len;i++) obj[i]=this.arr[i]; this.arr=obj; this.capacity=newcapacity; } this.arr[this.len++]=x; } //移除第i个位置的元素 @Override public T remove(int i) { T ret=(T)this.arr[i]; for(int j=i+1;j<this.len;j++) { this.arr[j-1]=this.arr[j]; } this.len--; return ret; } @Override public int indexof(T x) { for(int i=0;i<this.len;i++) { if((T)this.arr[i]==x) return i; } return -1; } }
测试类
public class Test { public static void main(String[] args) { /* SLinkedList<Integer> slinkedList=new SLinkedList<>(); slinkedList.add(1); slinkedList.add(2); slinkedList.add(3); slinkedList.add(4); slinkedList.add(5); slinkedList.add(6); for(int i=1;i<=slinkedList.size();i++) { System.out.println("第"+i+"位置的元素是"+slinkedList.get(i)); } boolean ie=slinkedList.isEmpty(); if(ie==true) System.out.println("单链表为空"); else System.out.println("单链表不为空"); //返回线性表的长度 int size=slinkedList.size(); System.out.println("单链表的长度为"+size); //返回第i个元素 int ret1=slinkedList.get(3); System.out.println("单链表第3个位置的元素为"+ret1); //设置第i个元素值为x slinkedList.set(3,7); ret1=slinkedList.get(3); System.out.println("单链表第3个位置的元素为"+ret1); //插入x作为第i个元素 slinkedList.add(3,5); for(int i=1;i<=slinkedList.size();i++) { System.out.println("增加元素后第"+i+"位置的元素是"+slinkedList.get(i)); } //删除第i个元素并返回被删除对象 int ret2=slinkedList.remove(4); for(int i=1;i<=slinkedList.size();i++) { System.out.println("删除元素后第"+i+"位置的元素是"+slinkedList.get(i)); } //查找,返回首次出现的关键字为key的元素 int ret3=slinkedList.indexof(5); System.out.println("首次出现关键字为key的元素的位置是"+ret3); for(int i=1;i<=slinkedList.size();i++) { System.out.println("单链表逆转前:第"+i+"位置的元素是"+slinkedList.get(i)); } slinkedList.reverse(); for(int i=1;i<slinkedList.size();i++) { System.out.println("单链表逆转后:第"+i+"位置的元素是"+slinkedList.get(i)); } */ System.out.println("----------------------------------"); SeqList<Integer> seqList=new SeqList<>(); seqList.add(1); seqList.add(2); seqList.add(3); seqList.add(4); seqList.add(5); seqList.add(6); for(int i=0;i<seqList.size();i++) { System.out.println("第"+i+"位置的元素是"+seqList.get(i)); } boolean sie=seqList.isEmpty(); if(sie==true) System.out.println("顺序表为空"); else System.out.println("顺序表不为空"); //返回线性表的长度 int ssize=seqList.size(); System.out.println("顺序表的长度为"+ssize); //返回第i个元素 int sret1=seqList.get(3); System.out.println("顺序表第3个位置的元素为"+sret1); //设置第i个元素值为x seqList.set(3,7); sret1=seqList.get(3); System.out.println("顺序第3个位置的元素为"+sret1); //插入x作为第i个元素 seqList.add(3,5); for(int i=0;i<seqList.size();i++) { System.out.println("增加元素后第"+i+"位置的元素是"+seqList.get(i)); } //删除第i个元素并返回被删除对象 int sret2=seqList.remove(4); for(int i=0;i<seqList.size();i++) { System.out.println("删除元素后第"+i+"位置的元素是"+seqList.get(i)); } //查找,返回首次出现的关键字为key的元素 int sret3=seqList.indexof(5); System.out.println("首次出现关键字为key的元素的位置是"+sret3); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。