本篇我们介绍下数据结构中的顺序表、链表的基础概念,以及它们各自的java代码实现。
package com.tingcream.alg.linear;
import java.util.Iterator;
/**
* 顺序表 api设计 (基于数组)
* 类名: SequenceList
* 构造方法: SequenceList(int capacity)//指定容量
* 成员方法:
* public void clear() 置空顺序表
* public boolean isEmpty()
* public int size() 获取线性表长度
* public T get(int i); O(1)
* public void add(T t); O(1)
* public void add(int i ,T t); O(n)
* public T remove(); O(1)
* public T remove(int i); O(n)
* public int indexOf(T t); O(n)
* public boolean contains(T t);
*
* 成员变量 :
* private T[] eles; 存储数据的数组
* private int N;当前线性表的长度
*
*/
public class SequenceList implements Iterable{
private T[] eles;//存储数据的数组 ()
private int N ;//线性表长度 ,相当于一个指针初始是指向索引0
public SequenceList(int capacity){
this.eles=(T[])new Object[capacity];
this.N=0;
}
//置空顺序表
public void clear(){
this.N=0;
}
//判断顺序表是否为空
public boolean isEmpty(){
return this.N==0;
}
//获取顺序表的长度
public int size(){
return this.N;
}
//获取指定索引的值
public T get(int i){
return eles[i];
}
//向顺序表尾部插入元素
public void add(T t){
if(N==eles.length){
resize(2*eles.length);
}
this.eles[N++]=t;
//调用重载的insert方法
// add(N,t);
}
//插入元素
public void add(int i,T t){
if(N==eles.length){
resize(2*eles.length);
}
for(int index=N;index>i;index--){
eles[index]=eles[index--];
}
eles[i]=t;
this.N++;
}
//移除最后一个元素
public T remove(){
//调用重载的remove方法
return remove(N-1);
}
//移除一个元素
public T remove(int i){
T value= this.eles[i];
for(int index=i;index=0;
}
//扩容或缩容
public void resize(int newSize){
T[] original=eles;
eles=(T[])new Object[newSize];
for(int i=0;i iterator() {
return new Itr();
}
//迭代器类
private class Itr implements Iterator{
private int cursor;
public Itr(){
this.cursor=0;
}
@Override
public boolean hasNext() {
return cursor
}
}
}
package com.tingcream.alg.test;
import com.tingcream.alg.linear.SequenceList;
public class SequenceListTest {
public static void main(String[] args) {
SequenceList list=new SequenceList(4);
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
list.remove(1);
//遍历
for(String s: list){
System.out.println(s);
}
}
}
package com.tingcream.alg.linear;
import java.util.Iterator;
/**
* 链表 api设计
* 类名: LinkList
* 构造方法: LinkList()
* 成员方法:
* public void clear()
* public boolean isEmpty()
* public int size()
* public T get(int i)
* public void add(T t)
* public void add(int i ,T t)
* public T remove()
* public T remove(int i)
* public int indexOf(T t)
* public boolean contains(T t);
*
* 成员内部类:
* private class Node 节点类
* 成员变量:
* private Node head;//头结点元素
* private int N ; //链表长度
*/
public class LinkList implements Iterable{
private Node head;//表示头结点
private int N;// 链表长度
//构造方法
public LinkList(){
this.head=new Node(null,null);
this.N=0;
}
//清空链表
public void clear(){
this.head.next=null;
this.N=0;
}
//获取链表长度
public int size(){
return N;
}
//判断链表是否为空
public boolean isEmpty(){
return N==0;
}
//根据位置i获取元素
public T get(int i){
Node n=head.next;
for(int index=0;index=0;
}
//反转链表
public void reverse(){
if(isEmpty()){
return ;
}
reverse(head.next);
}
//把当前反转后的结点对象返回
private Node reverse(Node current){
if(current.next==null){
head.next=current;
current.next=null;
return current;
}
Node n= reverse(current.next);
n.next=current;
current.next=null;
return current;
}
@Override
public Iterator iterator() {
return new Itr();
}
//内部类 迭代器
private class Itr implements Iterator{
private Node n;
public Itr(){
this.n=head;
}
@Override
public boolean hasNext() {
return n.next!=null;
}
@Override
public T next() {
n=n.next;//n指针向后移动一步
return n.item;
}
}
//内部类 ,表示结点
private class Node {
private T item;
private Node next;
public Node(T item,Node next){
this.item=item;
this.next=next;
}
}
}
package com.tingcream.alg.test;
import com.tingcream.alg.linear.LinkList;
public class LinkListTest {
public static void main(String[] args) {
LinkList list =new LinkList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
for(String s: list){
System.out.println(s);
}
System.out.println("bb位置:"+list.indexOf("bb"));
System.out.println("是否包含aa:"+list.contains("aa"));
}
}
ok ..


阅读排行


Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1