剑指Offer——删除链表中重复的结点

题目描述:

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

分析:

因为已经排好序了,所以如果相邻的数值一样的话,那么就跳过该数值,不过要记录前一结点的指针,将其next指向后一个没有重复的结点。

代码:

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6         val(x), next(NULL) {
 7     }
 8 };
 9 */
10 class Solution {
11 public:
12     ListNode* deleteDuplication(ListNode* pHead) {
13         if(pHead == NULL) return NULL;
14         ListNode* phead = NULL;
15         ListNode* p1 = pHead;
16         ListNode* p2 = NULL;
17         while(p1) {
18             if(p1->next) {
19                 int val = p1->val;
20                 if(val == p1->next->val) {
21                     while(p1->next && p1->next->val == val) p1 = p1->next;
22                 } else {
23                     if(phead == NULL) phead = p2 = p1;
24                     else {
25                         p2->next = p1;
26                         p2 = p1;
27                     }
28                 }
29             } else {
30                 if(phead == NULL) phead = p2 = p1;
31                 else {
32                     p2->next = p1;
33                     p2 = p1;
34                 }
35             }
36             if(p1 == NULL) break;
37             p1 = p1->next;
38         }
39         if(p2) p2->next = NULL;
40         return phead;
41     }
42 };
时间: 2024-10-12 04:35:54

剑指Offer——删除链表中重复的结点的相关文章

剑指offer-18-2. 删除链表中重复的结点

剑指offer-18-2. 删除链表中重复的结点 链表 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 采用递归的方法查找从头节点开始重复的节点 如果没有重复节点,pHead.next指向deleteDuplication(pHead.next)返回的pHead.next本身 如果有重复节点则pHead.next指向pHead

剑指Offer-56.删除链表中重复的结点(C++/Java)

题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 分析: 递归思路,如果当前结点和它的next结点的val值不同,则当前结点可以直接接到已处理完的结点后,继续删除重复的过程:如果当前结点和它的next结点的val值相同,则需要继续遍历,直到找到一个与当前结点val不同的结点作为新链表的头结点,如果找不到,说明链表所有结点元素都一

剑指offer57 删除链表中重复的结点

class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(!pHead) return pHead; struct ListNode *pre=(struct ListNode *)malloc(sizeof(struct ListNode)); pre->next=pHead; ListNode *p1=pre; ListNode *p2=pre->next; while(p2&&p2

56、剑指offer--删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路:从头遍历整个链表,如果当前结点和下一结点值相同,则应当删除.为了保证结点不断,需要保存pre结点,然后找到不相等的next,pre->next = next;注意删除的是头结点的情况,单独处理. 1 /* 2 struct ListNode { 3 int va

剑指offer---删除链表中重复的结点2

递归版本: class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if (pHead==NULL) return NULL; if (pHead!=NULL && pHead->next==NULL) return pHead; ListNode* current; if ( pHead->next->val==pHead->val){ current=pHead->ne

剑指offer---删除链表中重复的结点

class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if (pHead == NULL) return pHead; if (pHead->next == NULL) return pHead; int First = pHead->val; ListNode* head = new ListNode(First + 1); head->next = NULL; head->next = p

删除链表中重复的结点-剑指Offer

删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路 需要两个指针,一个指向前一个节点preNode,另一个指向当前节点node,如果遇到相等的节点,node向后移动,preNode不动,存下node.val方便后面的比较,直到遇到node和node.next不相等,preNode就可以指向node.n

剑指offer(四十三)之删除链表中重复的结点

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

[剑指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