leetcode203移除链表元素

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值