题解 | #牛群排列去重# Java
牛群排列去重
https://www.nowcoder.com/practice/8cabda340ac6461984ef9a1ad66915e4
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
// 将当前节点和前一个节点初始化为头节点
ListNode cur = head;
ListNode pre = head;
while (cur != null) {
// 如果当前节点的下一个节点为空,表示到达链表尾部,结束循环
if (cur.next == null)
break;
// 如果当前节点的值等于下一个节点的值,说明有重复节点
if (cur.val == cur.next.val) {
pre = cur; // pre节点指向当前节点
while (true) {
// 如果当前节点的下一个节点为空或者当前节点的值小于下一个节点的值,
// 说明找到了重复节点的最后一个节点,将pre节点的next指向下一个节点,并结束内层循环
if (cur.next == null || cur.val < cur.next.val) {
pre.next = cur.next;
break;
}
cur = cur.next; // 继续遍历下一个节点
}
}
cur = cur.next; // 当前节点指向下一个节点,继续遍历
}
return head; // 返回删除重复节点后的链表头节点
}
}
主要考察了链表的操作和节点的删除。通过使用两个指针 cur 和 pre 来遍历链表,找到重复的节点,并删除重复节点中的所有节点
详细解释如下:
- 初始化
cur和pre为头节点,开始遍历链表。 - 如果
cur的下一个节点为空,说明到达链表尾部,结束循环。 - 如果
cur的值等于下一个节点的值,说明有重复节点。将 pre 指向 cur,然后进入内层循环。在内层循环中,判断当前节点 cur 的下一个节点是否为空或者当前节点的值小于下一个节点的值。如果是,说明找到了重复节点的最后一个节点,将 pre 的 next 指向下一个节点,并结束内层循环。如果不是,继续遍历下一个节点。 cur指向下一个节点,继续外层循环。- 返回删除重复节点后的链表头节点。
