数据结构与算法---链表---移除链表元素、两数相加

本文详细介绍了链表数据结构的基本操作如插入与删除,并通过具体示例解释如何解决实际问题,如移除链表元素及两数相加等问题。文章还提供了解题技巧,包括使用虚拟头结点简化边界条件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建议

涉及到链表的数据结构与算法
一定要画图,使得思路清晰,MJ说99%以上的链表题目,画图后就容易想思路了。

最好使用头结点,使得不需要判断链表为空的边界条件

其他方法有:
快慢指针
多指针

必备链表知识点:

链表节点的插入与删除
翻转链表
利用快慢指针求中心节点
计算链表的长度


移除链表元素

203 移除链表元素

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

思路

该链表是单链表,当判断出B节点与val相等的时候,需要使用B前面的指针A,修改A的指针指向B的下一个节点C,也就是A->B->C 修改为 A->C
问题是,在判断B节点相等的时候,指针不能在B上,如果指针在B上,则A就找不到了(单向链表)
所以,在判断节点B的值的时候,指针需要处在A的节点上。使用A.next.val 是否等于 val

另外,建立虚拟节点,就不需要判断链表是否为null
不要直接使用head,或者虚拟头结点进行遍历,遍历完了找不到头了。需要定义一个遍历节点。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //建立虚拟头结点
        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;
        ListNode preNode = dummyHead;

        while(preNode.next != null)
        {
            if(preNode.next.val == val)
            {
                preNode.next = preNode.next.next;
            }else{
                preNode = preNode.next;
            }
        }
        return dummyHead.next;
    }
}

还有其他解法,比如:递归

更多学习:
数据结构与算法—线性表—删除排序链表中的重复元素


两数相加

2. 两数相加

题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807


思路

为何342+465要逆序存储?

这是因为,我们再算两数之和的时候,是从最小位开始计算,最后才是计算最高位
因此,需要逆序,先算2+5,再算4+6,再算3+4
其实就是求 链表2->4->3与链表5->6->4的和
但有个问题是:
2+5 = 7,4+6 = 10,3+4 = 7
4+6需要进位,进位值为1,因此,3+4上面还需要加之前的进位数1。

也就是,我们设立一个进位数 int jinwei = 0;
2 + 5 + jinwei = 7;
4 + 6 + jinwei = 10;

if(结果 >= 10)
{
	对结果取余操作,余数 = 4 + 6 + jinwei;
	jinwei = 1;
}else{
	jinwei = 0;
}

3 + 4 + jinwei = 8;

在这里插入图片描述

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if (l1 == null) return l2;
		if (l2 == null) return l1;
		
		//建立虚拟头结点
		ListNode dummyHead = new ListNode(-1);
		ListNode currentNode = dummyHead;
		int jinWei = 0;
		
		while(l1 != null || l2 != null)
		{	
            int val1 = 0;
            if(l1 != null){
                val1 = l1.val;
                l1 = l1.next;
            }

            int val2 = 0;
            if(l2 != null){
                val2 = l2.val;
                l2 = l2.next;
            }
            
			int sum = val1 + val2 + jinWei;
            jinWei = sum / 10;
            currentNode.next = new ListNode(sum % 10);
			currentNode = currentNode.next;
		}

        //如果最后的进位还有值,也就是最后是7 8,加起来是15,sum = 5,进位1还得新建一个结点
        if(jinWei > 0)
        {
            currentNode.next = new ListNode(jinWei);
        }
        return dummyHead.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值