2022-2-16剑指offer day6
题1:
JZ76 删除链表中重复的结点
描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
数据范围:链表长度满足 0 \le n \le 1000 \0≤n≤1000 ,链表中的值满足 1 \le val \le 1000 \1≤val≤1000
进阶:空间复杂度 O(n)\O(n) ,时间复杂度 O(n) \O(n)
例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 } 10 */ 11 public class Solution { 12 public ListNode deleteDuplication(ListNode pHead) { 13 ListNode dummy=new ListNode(0),point=pHead; 14 dummy.next=pHead; 15 ListNode pre=dummy; 16 while (point!=null) { 17 if (point.next!=null&&point.next.val==point.val){ 18 while (point.next!=null&&point.next.val==point.val){ 19 point=point.next; 20 } 21 pre.next=point.next; 22 point=point.next; 23 }else { 24 pre=point; 25 point=point.next; 26 } 27 } 28 return dummy.next; 29 } 30 }
思路:遍历链表,同时记录上一个节点pre,当遇到重复数字的时候,将pre接到重复节点的末尾。对于链表头部的处理,可以用虚拟头节点。
题2:
JZ18 删除链表的节点
描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
1 import java.util.*; 2 3 /* 4 * public class ListNode { 5 * int val; 6 * ListNode next = null; 7 * public ListNode(int val) { 8 * this.val = val; 9 * } 10 * } 11 */ 12 13 public class Solution { 14 /** 15 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 16 * 17 * 18 * @param head ListNode类 19 * @param val int整型 20 * @return ListNode类 21 */ 22 public ListNode deleteNode (ListNode head, int val) { 23 // write code here 24 ListNode dummy=new ListNode(0); 25 dummy.next=head; 26 ListNode pre=dummy,point=head; 27 while (point!=null) { 28 if (point.val!=val){ 29 pre=point; 30 point=point.next; 31 }else { 32 pre.next=point.next; 33 point=point.next; 34 } 35 } 36 37 38 return dummy.next; 39 } 40 }
思路:与题1类似,维护pre节点和dummy来实现删除。