题解 | 牛群排列去重 | Java
牛群排列去重
https://www.nowcoder.com/practice/8cabda340ac6461984ef9a1ad66915e4
考察链表遍历操作,使用Java语言
根据条件有以下的情况:
- 特殊情况:只有一个节点或者没有节点
- 一般的情况
对于特殊情况,23行标准写法
一般情况下,利用链表的遍历操作,设置左右指针,思路如下:
固定左指针,不断遍历右指针,在遍历的过程中根据左右指针值的相同与否从而进行对应的操作。
注意,因为是右指针在动,所以在while的条件中均需要加上right.next!=null来防止空指针异常
26-28 左右指针对应取值不同时进行左右指针的更新
29-42是当发生左右指针值重复时的操作,其中包含右指针一直遍历到新的值(31-33)
这其中也包含两种情况,一种是找到新的取值,那么就删除left到right之间重复的取值(35-37)
也有可能之间的值一直重复到最后,那么需要直接删除left后面的所有值(44)
提供一些自测的例子:
{2,2,2,5,5,5}
{2,2,2,2}
{2,2,2,3,3,4,5,5,6}
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
if(head==null||head.next==null) return head; //特殊情况处理
ListNode left = head, right = head.next;
while(right.next!=null){ //让右指针不断向右遍历
if(left.val!=right.val){
left = right;
right = right.next; //与41行重复 可以提出到42 表示右指针一直遍历这个动作
}else{ //发生取值重复的情况
// 让右指针一直向后遍历 直到找到新的值
while(left.val==right.val&&right.next!=null){
right = right.next;
}
//一直检查直到发现新的值的时候将中间的进行删除
if(left.val!=right.val){
left.next = right;
left = right;
}else{ //右指针已经遍历到了最后一个节点 结束遍历操作
break;
}
right = right.next;
}
}
if(left.val==right.val) left.next=null;
return head;
}
}
#面试高频TOP202##算法#
查看23道真题和解析
深信服公司福利 790人发布