数据结构之链表下的Set
set集合的特点是:无序(自己有顺序,但是不一定和输入的顺序一致),不重复。
自定义set接口
package com.company.set;
/**
* 自定义set集合接口
* 特点:元素不重复
*
* @Author: wenhua
* @CreateTime: 2023-01-10 09:38
*/
public interface Set<T> {
// 判断集合是否为空
boolean isEmpty();
// 判断集合set是否包含该元素
boolean isContain(T ele);
// 添加元素
void add(T ele);
// 删除指定元素
boolean removeEle(T ele);
// 获得集合set元素个数
int getSize();
}
自定义链表
前面文章已经发表过链表的实现。需要注意的是,在添加元素时,如果链表中已经存在该元素,就不再添加,满足set集合的不重复性。
/**
* 添加链表元素
* 特点:在链表的头部添加
*
* @param ele
*/
public void add(T ele) {
// 判断该元素是否存在,如果存在则不需要存储(set集合的条件)
if (isContain(ele))
return;
// 创建新节点
Node newNode = new Node(ele);
// 将头结点数据连接在新节点后
newNode.next = head;
// 将新节点连接在头结点的下一个结点
head = newNode;
// 元素个数加1
size++;
}
自定义链表实现Set接口
package com.company.set;
/**
* @Author: wenhua
* @CreateTime: 2023-01-10 09:46
*/
public class LinkSet<T> implements Set<T> {
private Link link;
public LinkSet() {
link = new Link();
}
@Override
public boolean isEmpty() {
return link.isEmpty();
}
@Override
public boolean isContain(T ele) {
return link.isContain(ele);
}
@Override
public void add(T ele) {
link.add(ele);
}
@Override
public boolean removeEle(T ele) {
return link.remove(ele);
}
@Override
public int getSize() {
return link.getSize();
}
@Override
public String toString() {
return "linkSet{" +
"link=" + link +
'}';
}
}
测试
package com.company.set;
/**
* @Author: wenhua
* @CreateTime: 2023-01-10 10:08
*/
public class Main {
public static void main(String[] args) {
Main main = new Main();
main.LinkSetTest();
}
public void LinkSetTest() {
LinkSet<String> mySet = new LinkSet<String>();
System.out.println("判断set集合是否为空:" + mySet.isEmpty());
mySet.add("wenhua");
System.out.println("判断set集合是否为空:" + mySet.isEmpty());
System.out.println("判断set集合中是否存在Jack该元素:" + mySet.isContain("Jack"));
mySet.add("Jack");
System.out.println("判断set集合中是否存在Jack该元素:" + mySet.isContain("Jack"));
System.out.println("获取set集合长度:" + mySet.getSize());
System.out.println(mySet);
mySet.add("Jack");
System.out.println(mySet);
System.out.println("移除set集合中Jack该元素:" + mySet.removeEle("Jack"));
System.out.println(mySet);
}
测试结果
判断set集合是否为空:true
判断set集合是否为空:false
判断set集合中是否存在Jack该元素:false
判断set集合中是否存在Jack该元素:true
获取set集合长度:2
linkSet{link=Jack,wenhua}
linkSet{link=Jack,wenhua}
移除set集合中Jack该元素:true
linkSet{link=wenhua}