1、解法:
设置虚拟节点dummy,并不是链表的节点,链表的节点从head开始,head为第一个元素所在的位置
2、删除的准则:
以删除7节点为例:上一个节点pre=cur.next,cur=cur.next。
3、不删原则:pre=cur,cur=cur.next
java代码
内涵链表结构设计、遍历、头部添加节点、删除节点
public class Topic203 implements Iterable<Integer>{
//内部类构造节点。
public static class ListNode{
//当前节点的值
int value;
//当前节点的下一个节点是哪一个
ListNode next;
//无参构造器
public ListNode(){
}
//有参构造器
public ListNode(int value, ListNode next){
this.value=value;
this.next=next;
}
}
//设置虚拟节点dummy
static ListNode dummy = new ListNode(-1, null);
//迭代器遍历链表
public static void For1(){
ListNode p = dummy.next;
while(p!=null) {
System.out.println(p.value);
p = p.next;//p指向的节点的下一个节点赋值给p指向的节点。相当于移动
}
}
//头部添加节点
public static ListNode addFirst(int value){
dummy.next = new ListNode(value,dummy.next);
return dummy.next;
}
//删除指定值的节点
public static ListNode removeElements(ListNode head, int val) {
if(head==null){
return head;
}
ListNode pre = dummy;
ListNode cur = head;
while (cur!=null){
if(cur.value==val){
pre.next=cur.next;
}else{
pre=cur;
}
cur=cur.next;
}
return dummy.next;
}
}
测试代码:
@Test
public void test6(){
Topic203 pummy = new Topic203();
pummy.addFirst(8);
pummy.addFirst(7);
pummy.addFirst(19);
pummy.addFirst(1);
ListNode head = pummy.addFirst(8);
pummy.For1();
System.out.println("-------------------------");
pummy.removeElements(head,8);
pummy.For1();
}
结果:原链表:8->1->19->7->8
删除后:1->19->7