解法都在代码里,不懂就留言或者私信,比第一题稍微难点
题目比较简单,真实面试中82和83都出现过,83偏多,先有个基础,马上分析82
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode deleteDuplicates(ListNode head) {/**无节点或者只有一个,没有什么好删除的 */if(head == null || head.next == null) {return head;}/**pre表示前一个遍历的节点*/ListNode pre = null;/**cur是现在正在遍历的节点*/ListNode cur = head;while(cur != null) {/**如果不是第一个节点并且当前节点和上一个节点值相同,就一直跳,直到跳到null或者不一样的值 */while(cur != null && pre != null && cur.val == pre.val) {cur = cur.next;}/**如果前面有节点(不是第一个不重复节点,就把前面和现在连接起来)这一步是不是比较奇怪,因为我们可能跳过了重复节点,其实pre原来是连在第一个重复节点上的,现在换到第一个不重复节点了*/if(pre != null) {pre.next = cur;}/**正常遍历的过程中都应该把当前节点给pre,因为它是下个要遍历的节点的上一个节点 */pre = cur;/**这个时候可能cur已经是null了,如果是的话就不跳下一个了 */if(cur != null) {cur = cur.next;}}/**头从未变过,即使头是重复的,所以我们这里返回头 */return head;}
}
运行结果,这个题真的是第一次做