网址: www.nowcoder.com/practice/f9…
描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
if(head==nullptr) //链表为空
{
return head;
}
else if(head->val==val) //头结点为删除结点
{
return head->next;
}
ListNode* pre=head;
ListNode* flag=head->next;
while(flag)
{
if(flag->val == val)
{
if(flag->next==nullptr) //尾结点为删除结点
{
pre->next=nullptr;
return head;
}
pre->next=flag->next; //中间结点为删除结点
flag->next=nullptr;
return head;
}
flag=flag->next;
pre=pre->next;
}
return head;
}
};
总结:
用的双指针,分别指向要判断的结点和此节点的前一个结点。删除的时候先让pre的指针指向删除结点的下一个结点,再把删除结点的指针指向空。
要注意头结点和尾结点是删除结点的问题。
如果用单指针:
if(node.next.val==val)
node.next = node.next.next;
nullptr和null区别如下:
1、nullptr在C语言中一般为关键字,表示空指针,而NULL只是一个宏定义。
2、nullptr可以被自动转换为各种pointer类型,但不会被转换为任何整数类型,而null与0的作用相似,表示空数据。
3、nullptr 能够转换成任何指针类型(包括成员函数指针和成员变量指针)和bool类型(这是为了兼容普通指针都能使用 if(ptr) 判断是否为空指针的形式),但是不能被转换为整数0。