需要注意几个点:
1)特殊处理下链表的头节点。
2)通过链表遍历实现,保留扫描节点的前一个节点,方便删除操作。
3)如果找到等于给定值Val的节点,则删除当前扫描节点,即更新扫描节点为“当前扫描节点->next”,更新扫描节点的前一个节点->next为“当前扫描节点->next”。特殊处理链表头节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param head a ListNode
* @param val an integer
* @return a ListNode
*/
ListNode *removeElements(ListNode *head, int val) {
// Write your code here
ListNode *nextnode, *prenode;
if (head == NULL) return NULL;
nextnode = head; // 待依次比较的对象,当前扫描节点
prenode = NULL; // 当前扫描节点的前一个节点,留存这一位置,方便删除操作
while (nextnode != NULL) {
if (nextnode->val == val) { //找到等于Val的节点,删除当前扫描节点
nextnode = nextnode->next;
if (prenode != NULL) {
prenode->next = nextnode;
}
else { //特殊处理下表头节点
head = nextnode;
}
}
else { //依序遍历链表下一个节点,直至链表结尾
prenode = nextnode;
nextnode = nextnode->next;
}
}
return head;
}
};