到了刷题的第二个板块了——链表操作。移除节点操作是非常基本也是非常重要的,链表中节点的移除要注意一定要遍历得到移除节点的前一个节点(比如说移除第i个节点就必须要有第i-1个节点的指针),因为链表查找的低效性,所以链表一些操作会相对数组来得更麻烦一点。
本次总结的题目为链表的指定节点移除(题目序号为203)
移除节点包括两种:给定值val移除;给定索引移除。
给定索引移除相对比较简单,只需要去遍历到相应位置去操作就行
而给定值移除稍微复杂一点,因为需要去进行值的比较。
1.设立虚拟头结点帮助链表操作统一化(这里的操作指删除插入等)
(1)不使用虚拟头结点删除第一个节点(将首个节点先后移动一位就可以了)
删除后变为:
(2)使用虚拟头结点删除第一个节点(同删除链表中其他节点操作类似)
2.代码操作说明
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode fakehead = new ListNode(0);
//创建新的listnode节点并且其值域为0。
fakehead.next=head;
//虚拟头结点的next指向原头结点head
ListNode Node=fakehead;
//注意这里的Node是从虚拟头结点开始而不是从头结点开始是为了方便进行删除操作(这样删除的时候可以只用一个指针进行操作而不需要用双指针)
while(Node.next!=null){
if(Node.next.val==val){
Node.next=Node.next.next;
}else{
Node=Node.next;
}
}
return fakehead.next;
}
}
本题非常的简单也是基本操作,但是还是要牢牢记住,故专门写一篇文章来记录
另外,链表操作边界的判断和指针的移动逻辑真的很重要,需要多多练习