题解 | #牛群排列去重#
牛群排列去重
https://www.nowcoder.com/practice/8cabda340ac6461984ef9a1ad66915e4
一、考察知识
链表与指针的运用
二、解题思路
- 首先判断链表非空
- 设置pivot指向头结点,cur指向头结点下一节点
- 当cur存在时,若检测到pivot->val与cur->val相等,表示出现重复编号,此时直接令pivot->next = cur->next,即跳过重复的节点转到下一个节点
- 如果不相等,那就照常pivot后移一位
- 确保每次cur和pivot都会后移一位,无论是否检测到重复编号!
- 最终返回head
三、完整代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
// 如果链表为空,直接返回空指针
if(head==nullptr) return head;
// 定义两个指针:pivot 和 cur,pivot 指向当前不重复的节点,cur 用于遍历链表
ListNode *pivot = head;
ListNode *cur = pivot->next;
// 遍历链表,如果发现当前节点的值与 pivot 节点的值相同,说明当前节点需要被删除
// 否则将 pivot 指向当前节点,继续遍历链表
while(cur){
if(pivot->val == cur->val){
// 如果当前节点需要被删除,则将 pivot 的 next 指向当前节点的 next,跳过当前节点
pivot->next = cur->next;
}else{
pivot = pivot->next;
}
cur = cur->next;
}
// 返回处理后的链表头
return head;
}
};
#现在还是0offer,延毕还是备考#
查看20道真题和解析