Loading

【力扣】删除链表中的结点

题目描述

image
这道题的重点在在于理解题意。其特点在于需要在不给链表的head结点的情况下删除某个给定结点node。
首先想到的思路是把结点上的元素值依次向前移动,然后删除最后一个结点。
代码如下:

class Solution {
public:
    void deleteNode(ListNode* node) {
        if(node -> next -> next == nullptr){
            node -> val = node -> next -> val;
            node -> next = nullptr;
            return ;
        }
        ListNode* cur = node;
        while(cur != nullptr && cur -> next != nullptr){
            cur -> val = cur -> next -> val;
            if(cur -> next -> next == nullptr){
			//这个break语句是为了使cur出循环时落到末尾结点的前一个节点
			//而不是末尾节点,使下面的cur后移语句少执行一次
			//方便删除最后一个结点
                break;
            }
            cur = cur -> next;
        }
        cur -> next = nullptr;
        return ;
    }
};

这个控制循环中某些语句在末尾少执行一次的写法可以试着在其他地方用一用,因为链表题很多难点就是因为很难直接地找到结点的上一个结点,常常需要用双指针来随时存储或者把指针从一开始就前移一位,在有些情况下也可以像这样控制while循环来实现。

posted @ 2024-02-28 00:02  SaTsuki26681534  阅读(14)  评论(0)    收藏  举报