一、定义一个链表
1、代码段
public static class Node<E>{
E value;
Node<E> next;
public Node(E value) {
this.value = value;
}
}
Node<E> head; // head将来指向链表中的第一个有效节点
二、将链表用字符串的方法表示出来(将链表中的每一个节点值域拼接在一起)
public String toString(){
Node<E> cur=head;
String str="[";
while(null!=cur){
str+=cur.value;
if (null!=cur.next){
str+=",";
}
cur=cur.next;
}
str+="]";
return str;
}
三、头插
1、思路
2、代码段
public void addFirst(E data){
//创建新结点
Node<E> node1=new Node(data);
//判断列表是不是为空
if(null==head){
head=node1;
}else{
node1.next=head;
head=node1;
}
}
四、尾插
1、思路
2、代码段
public void addLast(E data){
//定义一个新的结点
Node<E> node = new Node(data);
//插入节点
//1.链表为空
if (head==null){
head=node;
}else{
//2.链表不为空
Node<E> cur =head;
while(null!=cur.next){
cur=cur.next;
}
cur.next=node;
//方法2
/*Node cur=head;
Node prev=null;
while(null!=cur){
prev=cur;
cur=cur.next;
}
prev.next=node;*/
}
五、任意位置的插入
1、思路
2、代码段
public boolean addIndex(int position,E data){
//1.检测测试是否合法
if(position<0||position>=4){
throw new IllegalArgumentException("addIndex:position非法");
}
if (0==position){
addFirst(data);
return true;
}
//2.找到index位置的节点,并保存其前一个
Node<E> prev=null;
Node<E> cur=head;
while(0!=position){
prev=cur;
cur=cur.next;
position--;
}
//3.插入新节点
Node<E> node2=new Node<>(data);
node2.next=cur;
prev.next=node2;
return true;
}
六、删除第一个值为key的节点
1、思路
2、代码段
//删除第一次出现关键字为key的节点
//考虑删除的节点是头节点和非头节点
public void remove(E e){
Node<E> cur =head;
Node<E> prev=null;
//确保是一个有效的链表
while(cur!=null){
if(e.equals(cur.value)){
//删除节点
//判断节点是不是第一个节点
cur.value=null;//让他不要指向对象
if (null==prev){
//这是第一个节点
head=cur.next;
}else{
//删除其他节点
prev.next=cur.next;
}
return;
}
prev=cur;
cur=cur.next;
}
}
七、删除所有值为key的节点
1、代码段
public void removeAllKey(E e) {
Node<E> cur = head;
Node<E> prev = null;
while (cur != null) {
if (e.equals(cur.value)) {
cur.value = null;
if(prev==null){
//删除
head = cur.next;
//向后遍历
cur=head;
} else {
//删除
prev.next = cur.next;
//向后遍历
cur = prev.next;
}
}else{//删除元素时,已经更新了cur,所以得使用else,防止再次更新漏了重复的key
prev = cur;
cur = cur.next;
}
}
}
八、查找是否包含关键字e包含在单链表中
1、代码段
public boolean contains(E e){
Node<E> cur=head;
while(null!=cur){
if (e.equals(cur.value)){
return true;
}
cur=cur.next;
}
return false;
}
九、得到链表的长度
1、代码段
public int size(){
Node<E>cur=head;
int count=0;
while(null!=cur){
count++;
cur=cur.next;
}
return count;
}