在一个排序的列表中,存在重复的节点,删除该链表中重复的节点,重复的节点不保存,返回链表头指针

typedef int SListDataType;
//链表中的一个节点
typedef struct Node{
 SListDataType   value;  //值
 struct Node *next;   //下一个节点的地址
 }Node;
//单链表
typedef struct SList{
 Node *first;//    *head    第一个节点的地址
} SList;

用三个指针

SList* DelectDuplication(Node * phead){
    if (phead == NULL){
        return NULL;
    }
        Node * fack = (Node *)malloc(sizeof(Node));//假节点
        fack->next = phead;
        Node *prev = fack;//前驱
        Node *p1 = phead;
        Node *p2 = phead->next;
        while (p2 != NULL){
            if (p1->value != p2->value){//不相等,同时走
                prev = p1;
                p1 = p2;
                p2 = p2->next;
            }
            else{
                while (p2 != NULL&&p2->value == p1->value){//相等,p2先走
                    p2 = p2->value;
                }
             
                Node *cur = p1;
                while (cur != p2){
                    Node *next = cur->next;
                    free(cur);
                    cur = next;
                }
                prev->next = p2;
                p1 = p2;
                if (p2!=NULL){
                    p2 = p2->next;
            }
        }
    }
        phead = fack->next;
        free(fack);
        return phead;
}

JAVA 写法:

public class Nowcoder {
    public class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }
public ListNode DelectDuplication(ListNode phead) {
           if(phead==null){
               return null;
           }
            ListNode fack = new ListNode(0);//假节点
            fack.next = phead;
            ListNode prev = fack;//前驱
            ListNode p1 = phead;
            ListNode p2 = phead.next;
              while (p2 != null){
                  if (p1.val != p2.val){//不相等,同时走
                            prev = prev.next;
                            p1 = p1.next;
                            p2 = p2.next;
                  }
                  else{
                      while (p2 != null&&p2.val == p1.val){//相等,p2先走
                                      p2 = p2.next;
                      }
                      prev.next = p2;
                      p1 = p2;
                      if (p2!=null){
                          p2 = p2.next;
                      }
                  }
              }

              return fack.next;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值