20天速通LeetCodeday09:关于链表
前言今日练习目的掌握如何遍历链表以及改变节点的next指向。206反转链表题目要求给定一个单链表的头节点head要求反转链表并返回反转后的链表核心思路使用三个指针prev当前节点的前一个节点cur 当前正在处理的节点next临时保存 cur 的下一个节点代码实现classSolution{publicListNodereverseList(ListNodehead){ListNodeprevnull;ListNodecurhead;while(cur!null){ListNodenextcur.next;// 保存下一个节点cur.nextprev;// 反转指针prevcur;// prev 前进curnext;// cur 前进}returnprev;}}总结掌握链表的语法:listNode prevnull203移除链表元素题目要求给定一个链表头节点head和一个值val。要求删除链表中所有等于val的节点并返回head核心思路引入虚拟头节点dummy防止第一个元素就是需要被删除元素遍历的逻辑如果 cur.next.val val删除 cur.next否则cur 向后移动代码实现classSolution{publicListNoderemoveElements(ListNodehead,intval){// 虚拟头节点ListNodedummynewListNode(0);dummy.nexthead;ListNodecurdummy;while(cur.next!null){if(cur.next.valval){cur.nextcur.next.next;// 删除节点}else{curcur.next;// 移动指针}}returndummy.next;}}总结掌握虚拟头节点的创建ListNode dummynew ListNode(0); dummy.nexthead遍历的逻辑返回dummy的语法return dummy.next21合并两个有序链表题目要求给定两个升序排列的链表list1和list2要求将他们合并成一个新的升序链表并返回核心思路双指针虚拟头节点将两个链表取出元素进行比较并拼接最后将剩余链表拼接代码实现ListNodedummynewListNoed(0);ListNodecurdummy;ListNodep1list1;ListNodep2list2;while(p1!nullp2!null){if(p1.valp2.val){curp1.val;p1p1.next;}else{curp2.next;p2p2.next;}curcur.next;}//拼接剩余if(p1!null){curp1;}else{curp2;}returndummy.next;总结要求做到升序链表想到用双指针来判断头节点的大小用剩余链表直接收尾2两数相加题目要求给你两个 非空 的链表表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的并且每个节点只能存储 一位 数字。请你将两个数相加并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外这两个数都不会以 0 开头核心思路代码实现ListNodedummynewListNode(0);ListNodecurdummy;intcarry0;while(l1!null||l2!null||carry!0){intsumcarry;if(l1!null){suml1.val;l1.l1.next;}if(l2!null){suml2.val;l2l2.next;}carrysum/10;cur.nextnewListNode(sum%10);curcur.next;}returndummy.next;总结本题的核心是链表逐位相加 进位 carry核心三要素sum l1 l2 carry当前位 sum % 10carry sum / 10