难度等级:简单
上一篇算法:
力扣此题地址:
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。

删除链表分三种情况:
1.删除第一个位置的结点
2.删除中间以及最后位置的结点
3.链表中没有要删除的结点
思路:
1.删除第一个结点,直接返回链表下一个结点即可
2.删除中间或最后位置的结点,首先设置两个指针,pre和cur指针,pre指向前一个结点,cur指向当前结点,用while循环遍历链表,判断是否是要删除的结点,找到了就跳出循环,然后将当前结点的前一个结点pre指向下一个结点cur.next;
3.跳出循环后,判断一下cur是否为null,为null则表示链表中没有要删除的结点,则返回head
- /**
- * Definition for singly-linked list.
- * public class ListNode {
- * int val;
- * ListNode next;
- * ListNode(int x) { val = x; }
- * }
- */
- class Solution {
- public ListNode deleteNode(ListNode head, int val) {
- //特殊情况处理,删除的节点是头结点时,比较特别
- if(head.val == val) return head.next;
-
- //设置两个指针,一个指针指向当前的节点
- ListNode pre = head;
-
- // 一个指针指向当前节点的下一节点
- ListNode cur = head.next;
-
- //当 cur 为空 或 cur 节点值等于 val 时跳出跳出循环
- while( cur != null && cur.val != val){
-
- // 两个指针不断的向前移动
- // pre 来到 cur 的位置
- pre = cur;
-
- // cur 来到下一个节点位置
- cur = cur.next;
- }
-
- //如果链表中没有要删除的结点,则返回头结点
- if(cur == null){
- return head;
- }
-
- // 相当于覆盖掉了 cur 的节点值
- pre.next = cur.next;
-
- // 最后返回链表头结点就行
- return head;
-
- }
- }