【链表】删除链表的节点( leetcode18)

一、题目

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。

【链表】删除链表的节点( leetcode18)
【链表】删除链表的节点( leetcode18)

二、题解

本题是一道简单的套路题,首先回忆一下删除链表节点的操作:首先定义两个指针pre、curr;然后从首到尾遍历一次链表,如果要删除当前节点,只需要:pre->next = curr->next。

关键在于:head->val也有可能等于val,所以本题返回的不是head,而是第一个不等于val值的节点。具体做法也很简单,只需在遍历之前,加上:

while(head)
{        
     if(head->val == val)
         head = head->next;
     else
         break;
 }

三、实现

根据以上的分析,相应的C++实现如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) {
        while(head)
        {        
            if(head->val == val)
                head = head->next;
            else
                break;
        }
        //此时的head是第一个不等于val的节点
        ListNode* curr = head;
        ListNode* pre = curr;
        while(curr->next)
        {
            curr = curr -> next;
            if(curr->val==val) // 如果等于,则删除当前节点;但不更新pre,因为curr->next 也有可能是val
                pre->next = curr->next;
            else
                pre = curr; // 不相同,则更新pre
        }
        return head;
    }
};
上一篇:lapage.js


下一篇:LeetCode83 删除排序链表中的重复元素