目录
一,简单介绍链表
二,自己实现单项非循环链表
一,链表
链表也是存储数据的一种,跟ArrayList不一样,ArrayList是跟数组一样物理与逻辑都是连续的,但是链表就和火车一样,每一个数据之间都有相关的引用将数据连接起来,就如下面这张图,通过引用下一个数据的地址来进行连接

二,自己实现单项非循环链表
主要方法为增删查改,链表里面的删除主要是改变指向

这是我们定义的每一个小节点,里面有数据val以及next指向,来指向下一个数据,让每一个数据串联起来,以及前一个数据prev,第一个数据head,最后一个数据last
public class MyLinkedList {
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 addFirst(int data){
ListNode listNode=new ListNode(data);
if (head==null){
head=listNode;
last=listNode;
}else {
listNode.next=head;
head.prev=listNode;
head=listNode;
}
}
//尾插法
public void addLast(int data){
ListNode listNode=new ListNode(data);
if(head==null){
head=listNode;
last=listNode;
}else {
listNode.next=null;
listNode.prev=last;
last.next = listNode;
last=listNode;
}
}
//任意位置插⼊,第⼀个数据节点为0号下标
public void addIndex(int index,int data){
ListNode listNode=new ListNode(data);
if (index<0 || index>size()){
System.out.println("位置错误");
return;
}
//特殊位置处理
if(index == 0) {
addFirst(data);
return;
}
if(index == size()) {
addLast(data);
return;
}
ListNode cur=searchIndex(index);
listNode.next=cur;
cur.prev.next = listNode;
listNode.prev = cur.prev;
cur.prev = listNode;
}
//通过位置去找数据
private ListNode searchIndex(int index){
int count=0;
ListNode cur=head;
if (index<0 || index>size()-1){
System.out.println("位置错误");
return null;
}
while (cur!=null){
count++;
cur=cur.next;
if (count==index){
return cur;
}
}
return null;
}
//查找是否包含关键字key是否在单链表当中
public boolean contains(int key){
ListNode cur=head;
while (cur!=null){
if (cur.val==key) {
return true;
}
cur=cur.next;
}
return false;
}
//删除第⼀次出现关键字为key的节点
public void remove(int key) {
if (head == null) {
return;
}
ListNode cur = head;
while (cur != null) {
if (cur.val == key) {
if (cur == head) {
//删除的节点是头节点
head = head.next;
if (head != null) {
//防止 当前双向链表 只有1个节点
head.prev = null;
}
}else {
cur.prev.next=cur.next;
if (cur.next==null){
last=last.prev;
}
cur.next.prev=cur.prev;
}
return;
}
cur=cur.next;
}
}
//删除所有值为key的节点
public void removeAllKey(int key){
if (head == null) {
return;
}
ListNode cur = head;
while (cur != null) {
if (cur.val == key) {
if (cur == head) {
//删除的节点是头节点
head = head.next;
if (head != null) {
//防止 当前双向链表 只有1个节点
head.prev = null;
}
} else {
cur.prev.next = cur.next;
if (cur.next == null) {
last = cur.prev;
} else {
cur.next.prev = cur.prev; // 只有非尾节点才执行!
}
}
}
cur = cur.next;
}
}
//得到单链表的⻓度
public int size(){
int count = 0;
ListNode cur = head;
while (cur != null) {
count++;
cur = cur.next;
}
return count;
}
//全部清除
public void clear() {
head=null;
}
//打印
public void display() {
ListNode cur=head;
while (cur!=null){
System.out.print(cur.val+" ");
cur=cur.next;
}
System.out.println();
}
}
719



被折叠的 条评论
为什么被折叠?



