Java实现单链表
package list;
/**
* 节点
*
* @author DeepSleeping
*
*/
public class ListNode {
Object data;
ListNode next;
public ListNode(Object data) {
super();
this.data = data;
}
}
package list;
/**
* 单链表
*
* @author DeepSleeping
*
*/
public class SingleList implements MyList {
private ListNode first;
private ListNode last;
private int size;
@Override
public void add(Object element) {
if (first == null) {
first = new ListNode(element);
last = first;
}else{
last.next = new ListNode(element);
last = last.next;
}
size++;
}
@Override
public void delete(Object element) {
ListNode p = first;
ListNode pre = null;
while(p != null){
if (p.data.equals(element)) {
//如果删除的是第一个元素
if (p == first) {
first = first.next;
}else{
pre.next = p.next;
}
break; //注意,删除了第一个相同的元素之后应该跳出循环
}
pre = p;
p = p.next;
}
size--;
}
@Override
public void delete(int index) {
if (index < 0 || index >= size) {
return;
}
int i = 0;//指针指向的节点的索引
ListNode p = first;
ListNode pre = null;
while(p != null){
if (i == index) {
if (p == first) {
first = first.next;
}
else{
pre.next = p.next;
}
break;
}
pre = p;
p = p.next;
i++;
}
size--;
}
@Override
public void update(int index, Object newElement) {
int i = 0;//指针指向的节点的索引
ListNode p = first;
while(p != null){
if (i == index) {
p.data = newElement;
}
p = p.next;
i++;
}
}
@Override
public boolean contains(Object target) {
ListNode p = first;
while(p != null){
if (p.data.equals(target)) {
return true;
}
p = p.next;
}
return false;
}
@Override
public Object at(int index) {
if (index < 0 || index >= size) {
return null;
}
int i = 0;//指针指向的节点的索引
ListNode p = first;
while(p != null){
if (i == index) {
return p.data;
}
p = p.next;
i++;
}
return null;
}
@Override
public int indexOf(Object element) {
int i = 0;
ListNode p = first;
while(p != null){
if (p.data.equals(element)) {
return i;
}
p = p.next;
i++;
}
return -1;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[");
ListNode p = first;
while(p != null){
sb.append(p.data);
if (p.next != null) {
sb.append(",");
}
p = p.next;
}
sb.append("]");
return sb.toString();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~