赞
踩
涉及到链表的数据结构与算法
一定要画图,使得思路清晰,MJ说99%以上的链表题目,画图后就容易想思路了。
最好使用头结点,使得不需要判断链表为空的边界条件
其他方法有:
快慢指针
多指针
…
链表节点的插入与删除
翻转链表
利用快慢指针求中心节点
计算链表的长度
…
删除链表中等于给定值 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; } }
还有其他解法,比如:递归
更多学习:
数据结构与算法—线性表—删除排序链表中的重复元素
题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。