c++和java代码如下,末尾
具体要点:
1.当我们需要删除某个节点时,具体核心操作是:
将上一个节点(pre)指向当前节点(cur)的下一个节点(then)
这样就跳过了当前节点(cur)
2.需要注意的是链表特性:如果遍历到前节点cur时,只能获取当前节点cur和之后节点then的内容,上一节点pre无法获取。所以无法将上一节点pre指向then。
解决方法,用pre->next表示cur。遍历到pre代替遍历到cur
3.出现新问题:头节点没有上一个节点怎么办?
解决方法:添加一个虚拟头节点放在前面 dummyHead
4.需要定义一个临时指针,对链表进行遍历,而不能使用head进行遍历(head指向的值不断变化,最后无法返回原先的头节点)
5.应该返回什么:head?还是dummyHead?还是dummyHead->next?
应该返回dummyHead->next,
首先,虚拟节点dummyHead是不需要的,直接返回虚拟节点的下一个节点
其次,原始的头节点head,可能在我们遍历过程中 ==target,已经被移除(删除)掉了
所以返回dummyHead的下一个节点,即 dummyHead->next 是我们需要的。
c++代码如下:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//添加虚拟头节点
ListNode* dummyHead = new ListNode();
//虚拟头节点指向head
dummyHead->next = head;
//创建临时指针,指向dummyhead
ListNode* cur = dummyHead;
while (cur->next!=nullptr)
{
if (cur->next->val == val) {
cur->next = cur->next->next;//跳过下一个值
}
else cur = cur->next;//否则指针指向下一个节点
}
return dummyHead->next;
}
};
java代码如下
class Solution {
public ListNode removeElements(ListNode head, int val) {
if (head == null) return head;
ListNode dummyHead=new ListNode(0);
dummyHead.next=head;
ListNode cur=dummyHead;
while(cur.next!=null){
if(cur.next.val==val){
cur.next=cur.next.next;
}
else cur=cur.next;
}
return dummyHead.next;
}
}