1.定义一个链表。我们知道链表中每个元素实际上存储的内容都要分为两部分,当前数值和指向元素的地址。不管是单向链表,双向还是循环都是这么个存储内容。那么对于java语言来说,我们要定义一个链表应该有两个成员变量,一个数值一个下一个元素的引用。这里的val就是当前节点的值,Listnode类型的next就是下一个节点的引用或者说指针。
2.移除链表元素
解题思路:对于单向链表元素的删除其实理解起来并不难,无非就是理解透上面1中提到的对链表的定义,既然单向我们要删掉一个元素就是让他的前一个元素的指针指向被删除的元素指向的对象,但就是写起来稍微麻烦一点,对于目前刚上手链表会需要一些时间理解。
下面是对“虚拟头指针”代码的解释:
public ListNode removeElements(ListNode head, int val) //这里两个参数分别是ListNode类型的头位置,数值val{
if (head == null){return head;//这里的意思是如果此时的头节点为空,说明没有节点,直接返回题中要求的头节点}
ListNode dummy = new ListNode (-1,head);//设计新的头节点,-1就是链表构造函数中的输入的val,head是原始头节点(这块让我想了好久刚开始真的迷不过来head的类型)
ListNode pre = dummy;
ListNode cur = head;//这两行其实就是换个名字的感觉,方便后面的循环
while(cur != null){
if(cur.val == val)
{
pre.next = cur.next;//如果当前节点就是要找的节点,虚拟头节点指向cur节点的下一个节点,也就是找出要删除节点里存放的next,把它放进虚拟头节点里。
}else{
pre = cur;//如果不是要找的节点的话就意味着不是头节点要被去掉,dummy虽然保留了,但是pre这个临时的虚拟头节点就不需要了,让它等于cur就是了。
}
cur = cur.next;//循环继续执行的内容,就是cur这个指针继续前进判断是否是要找的节点
}
return dummy.next;//记得这里是dummy.next因为dummy上面说了还在保留但仍是虚拟头节点,实际的头节点是它的next存放的节点。
}