代码随想录之链表的删除(c语言版与java版)

文章介绍了力扣第203题的解决方案,包括两种删除链表中指定值元素的方法。方法一是直接在原链表上操作,需要考虑头结点的特殊处理;方法二是通过创建虚拟头结点,简化头结点删除的操作。两种方法分别用C语言和Java实现,并有详细的思路解析。
摘要由CSDN通过智能技术生成

力扣203.移除链表的元素

解法出处——代码随想录

本题有两种解法:

方法一:直接再原来的基础上进行链表的删除。

1.C语言版:

	struct ListNode* removeElements(struct ListNode* head, int val){
	    struct ListNode *tmp;		//创建一个新的指针	
	    while(head != NULL && head -> val == val){  
	        tmp = head;
	        head  = head->next;
	        free(tmp);    
	    }
	    struct ListNode *cur = head;
	    while(cur != NULL && (tmp = cur->next) != NULL){
	        if (tmp->val == val) {
	            cur ->next = cur ->next ->next;
	            free(tmp);
	        }else{
	            cur =cur->next;
	        }
	    }
	    return head;

思路:该方法主要是再原来的链表的基础上来进行操作,因为头结点的与其他结点的删除不同,头结点没有前一个结点,所以需要单独分离出来。头结点之后的结点的移除只需要创建新的指针,将它跳过后释放即可。

头结点的移除过程具体如下图所示:
在这里插入图片描述
2.Java版本

public ListNode removeElements(ListNode head, int val) {
    while (head != null && head.val == val) {
        head = head.next;
    }
    // 已经为null,提前退出
    if (head == null) {
        return head;
    }
    // 已确定当前head.val != val
    ListNode pre = head;
    ListNode cur = head.next;
    while (cur != null) {
        if (cur.val == val) {
            pre.next = cur.next;
        } else {
            pre = cur;
        }
        cur = cur.next;
    }
    return head;
}

方法二:设置一个虚拟的头结点来对应。

1.C语言版

struct ListNode* removeElements(struct ListNode* head, int val){

    struct ListNode *dummy; //创建一个虚拟的头结点
    dummy =(struct ListNode*)malloc(sizeof(struct ListNode));  //创建这个虚拟的结点
    dummy ->next =head;
    struct ListNode *cur;
    cur = dummy;                            //从虚拟的头结点开始是因为删除一个结点的话,需要的是它的前一个结点,直接指向后面的结点。
    while(cur->next != NULL){
        if (cur->next->val == val){         //判断他的下一个结点是否是题目中所求的结点
            struct ListNode *tmp = cur->next;  //需要一个临时的指针指向cur的下一个结点中去
            cur->next = cur->next->next;
            free(tmp);
        }
        else{
            cur = cur->next;
        }
    }
    head = dummy->next;  //释放虚拟的结点
    free(dummy);
    return head;

}

思路:该方法主要创建一个新的虚拟的头结点,使该链表变为一个有头结点的链表,之后再在其基础上来进行操作。
2.Java版本

public ListNode removeElements(ListNode head, int val) {
    if (head == null) {
        return head;
    }
    // 因为删除可能涉及到头节点,所以设置dummy节点,统一操作
    ListNode dummy = new ListNode(-1, head);
    ListNode pre = dummy;
    ListNode cur = head;
    while (cur != null) {
        if (cur.val == val) {
            pre.next = cur.next;
        } else {
            pre = cur;
        }
        cur = cur.next;
    }
    return dummy.next;
}

Java版本的数据结构使用方法,及其相关的描述可借鉴:链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值