剑指offer 56.删除有序链表中的重复结点

56. 删除有序链表中的重复结点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

分析

借助辅助头结点,可避免单独讨论头结点的情况。设置两个结点 pre 和 cur,当 cur 和 cur.next 值相等,cur 一直向前走,直到不等退出循环,这时候 cur 指的值还是重复值,调整 cur 和 pre 的指针再次判断

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
 1 public class Solution {
 2     public ListNode deleteDuplication(ListNode pHead)
 3     {
 4         if(pHead == null || pHead.next == null){
 5             return pHead;
 6         }
 7
 8         // 每访问一个结点,循环判断是否重复
 9         ListNode cur = pHead;    // 指向当前结点
10        // 创建一个辅助头结点,指向前一个元素的指针,方便删除
11         ListNode head = new ListNode(Integer.MIN_VALUE);
12          head.next = pHead;
13         ListNode pre = head;
14
15         while(cur != null){
16             if(cur.next != null && cur.val == cur.next.val){
17                 // 如果重复,一直后移,直到找到不相等的结点
18                 while(cur.next != null && cur.val == cur.next.val){
19                     cur = cur.next;
20                 }
21                 cur = cur.next;    // 这个cur所指结点即是下一个不重复的结点
22                 pre.next = cur;
23             }else{
24                 pre= cur;
25                 cur = cur.next;
26             }
27         }
28         return head.next;
29     }
30 }

原文地址:https://www.cnblogs.com/hi3254014978/p/12347103.html

时间: 2024-09-30 20:07:07

剑指offer 56.删除有序链表中的重复结点的相关文章

删除有序链表中的重复结点

一,问题描述 请自己构造一个简单的有序单链表,然后实现删除链表中的重复结点.比如: 二,问题分析 首先要实现一个单链表,因此需要定义一个节点类Node.其次,实现向链表中添加结点的方法(使用尾插法)addNode 删除重复结点的实现思路: 定义两个指针:pre 和 next.初始时,pre指向链表中的第一个元素,next指向链表中的第二个元素.如果 pre 的值与 next 的值不相等,则两个指针分别都向后移一个结点:若相等,则删除 next 指针指向的结点即可. 三,整个代码实现 // del

LeetCode Remove Duplicates from Sorted List 删除有序链表中的重复结点

1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *deleteDuplicates(ListNode *head) { 12 if(head==0) r

剑指OFFER之合并有序链表(九度OJ1519)

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数.下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接下来一行包含m个元素,s(1<

[剑指offer] 56. 删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: class Solution { public: ListNode *deleteDuplication(ListNode *pHead) { if (pHead == NULL || pHead->next == NULL) return pHead; List

【剑指offer】九,链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 分析:此题为常见的快慢指针问题,java实现时要注意空指针错误以及边界条件.使用两个指针p和q,一个指针先走k-1步,然后第二个指针开始走.当第一个指针指向单链表的最后一个节点时,第二个指针指向倒数第k个节点.代码如下: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 }

《剑指Offer》题目:链表中倒数第k个结点

题目描述:输入一个链表,输出该链表中倒数第k个结点 题目分析:因为不能直接从链表的尾部遍历,所以要分两步走: 第一步:从链表的头部开始遍历,直至链表的尾部,统计出链表结点的个数 第二步:根据链表结点的个数,计算出倒数第k个结点的位置(从头部看的位置),即n-k+1个结点,输出该结点. Java代码: class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public clas

剑指offer十四之链表中倒数第k个结点

一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了. 三.代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class So

剑指offer【13】- 链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点. 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode FindKthToTail(ListNode head,int k) { 12 13 if(head == null){ 14

【剑指Offer】14、链表中倒数第k个结点

题目描述 输入一个链表,输出该链表中倒数第k个结点. 题解一:栈 1 public static ListNode FindKthToTail(ListNode head,int k) { 2 if(head==null||k<=0){ 3 return null; 4 } 5 Stack<ListNode> stack = new Stack<>(); 6 while (head!=null){ 7 stack.push(head); 8 head=head.next; 9