LintCode 452.删除链表中的元素 C++
2018-01-26 16:29
399 查看
问题描述:删除链表中等于给定值val的所有节点。
样例:给出链表 1->2->3->3->4->5->3,和val = 3,你需要返回删除3之后的链表:1->2->4->5。
// Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};分析:首先要判断链表是否为空,是的话直接返回,然后考虑到单链表的删除需要两个指针变量的配合作用,那么就要来定义两个变量,一个cur保存当前节点,另一个nex保存当前节点的下一个节点,从链表的第二个节点开始遍历,若nex的值与val的值相等,则将cur->next指向cur->next->next(即nex->next),删除节点。继续移动将
4000
cur和nex下移一位,往后遍历,直到链尾(nex为空)。再判断头结点head的value是否与val相等,如果相等,将头结点下移,删除原头结点,否则不做任何操作。遍历结束后返回head。
其次,对于头结点的判断,我刚开始觉得放在判断头结点是否为空之后也可以,试了一下发现报错了,例如原链表1->1->null和val为1,期望值null,结果1->null。出现的问题是,本例从第二个节点开始遍历,除了第一个节点外已经没有值与val相等的节点了,而提前判断之后再遍历,则会少判断第二个节点的值。
个人看法,如有错误,请批评指出。
样例:给出链表 1->2->3->3->4->5->3,和val = 3,你需要返回删除3之后的链表:1->2->4->5。
// Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};分析:首先要判断链表是否为空,是的话直接返回,然后考虑到单链表的删除需要两个指针变量的配合作用,那么就要来定义两个变量,一个cur保存当前节点,另一个nex保存当前节点的下一个节点,从链表的第二个节点开始遍历,若nex的值与val的值相等,则将cur->next指向cur->next->next(即nex->next),删除节点。继续移动将
4000
cur和nex下移一位,往后遍历,直到链尾(nex为空)。再判断头结点head的value是否与val相等,如果相等,将头结点下移,删除原头结点,否则不做任何操作。遍历结束后返回head。
class Solution { public: /* * @param head: a ListNode * @param val: An integer * @return: a ListNode */ ListNode * removeElements(ListNode * head, int val) { // write your code here if(head == NULL){ return head; } ListNode *cur = head; ListNode *nex = head -> next; while (nex != NULL){ if(nex -> val == val){ cur -> next = nex -> next; nex = nex -> next; }else{ cur = cur -> next; nex = nex -> next; } } if(head -> val == val) head = head -> next; return head; } };注意:要解决该问题,首先要熟悉单链表节点的删除,我的第一反应时保存当前节点和上一节点,单链表中对上一节点的定位有些麻烦,本例中定义当前节点和下一节点的方法效率更高一些。
其次,对于头结点的判断,我刚开始觉得放在判断头结点是否为空之后也可以,试了一下发现报错了,例如原链表1->1->null和val为1,期望值null,结果1->null。出现的问题是,本例从第二个节点开始遍历,除了第一个节点外已经没有值与val相等的节点了,而提前判断之后再遍历,则会少判断第二个节点的值。
个人看法,如有错误,请批评指出。
相关文章推荐
- Lintcode 452.删除链表中的元素
- [LintCode]452.删除链表中的元素
- 112. 删除排序链表中的重复元素(remove-duplicates-from-sorted-list)(c++)----lintcode面试题之链表
- C++单链表中删除指定范围内的元素
- 删除链表中的元素 - C++
- LintCode_452_删除链表中的元素
- 【LintCode-452】删除链表中的元素(Java实现)
- C++单链表中删除指定范围内的元素
- LintCode 删除链表中的元素
- lintcode 删除链表中的元素
- 372. 在O(1)时间复杂度删除链表节点 (delete-node-in-the-middle-of-singly-linked-list)(c++)----lintcode面试题之链表
- 删除链表中的元素-LintCode
- C++单链表中删除指定范围内的元素
- python_lintcode_115不同的路径 II_112删除排序链表中的重复元素
- 数据结构实验之链表七:单链表中重复元素的删除 c++练习
- C++单链表中删除指定范围内的元素
- LintCode 删除排序链表中的重复元素
- lintcode-入门-删除链表中的元素
- LintCode-删除排序链表中的重复元素
- C++单链表中删除指定范围内的元素