当前位置:   article > 正文

数据结构与算法---链表---移除链表元素、两数相加_链表去除一个元素使得前后相加得到奇数

链表去除一个元素使得前后相加得到奇数

建议

涉及到链表的数据结构与算法
一定要画图,使得思路清晰,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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

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


两数相加

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/920452
推荐阅读
相关标签
  

闽ICP备14008679号