解法都在代码里,不懂就留言或者私信,比第一题稍微难点
题目比较简单,真实面试中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;
}
}
运行结果,这个题真的是第一次做