问题

  • 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

解决

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
// class Solution {
//     public ListNode deleteDuplicates(ListNode head) {
//     ListNode dummyHead = new ListNode(0);               //创建虚拟头结点
//     dummyHead.next = head;                              //将head移到虚拟头结点后

//     ListNode prev = dummyHead;                          //将虚拟头结点值赋予(链表)变量1
//     ListNode cur = prev.next;                           //将变量1下一个值赋予(链表)变量2
//     while (cur != null) {                               //如果变量2不为空,进行while循环
//         int curRepeatNum = 0;                           //创建一个“计数” 整数
//         ListNode difNode = cur;                         //将变量2赋值给(链表)变量3
//         // 找到和cur指向的结点值不同的结点
//         while (difNode != null && difNode.val == cur.val) { //如果变量3不为空且变量3==变量2,进行while循环
//             curRepeatNum++;                             //“计数”加一
//              difNode = difNode.next;                    //讲过变量3移动到下一个节点
//          }  

//         // 如果curRepeatNum的值大于1,则表示cur指向的结点重复出现了
//         if (curRepeatNum > 1) {                         //如果“计数”>1(表示重复出现),进行if操作
//              prev.next = difNode;                       //将变量3的值赋予变量1下一位节点
//          }else {                                        //否则
//             // cur指向的结点没有重复出现,则将变量prev指向cur所指向的结点
//              prev = cur;                                //将变量2的值赋予变量1
//          }
//          cur = difNode;                                 //将变量3的值赋予变量2
//      }

//      return dummyHead.next;                            //返回虚拟链表
// }
// // head为已经创建好的链表
// // 若重复则后面一个必定与前面一个重复,则删除所有含有该数字的节点
// }


// 解法二:
class Solution{
    public ListNode deleteDuplicates(ListNode head){
        if(head==null){
            return head;
        }                                             //如果head为空,则直接返回head
        ListNode demmp=new ListNode(0,head);          //创建虚拟头结点(哑节点),并且将节点位于head之前
        ListNode cur=demmp;                            //创建节点变量
        while(cur.next!=null&&cur.next.next!=null){      
            if(cur.next.val==cur.next.next.val){            //将重复节点删除
                int x=cur.next.val;
                while(cur.next!=null&&cur.next.val==x){
                    cur.next=cur.next.next;
                }
            }else{                                     //跳过不重复的节点
                cur=cur.next;
            }
        }
        return demmp.next;                             //输出最终链表
    }
}

总结

  • 解决此问题主要是结点的移动,以及删除重复结点:
if(cur.next.val==cur.next.next.val){            //将重复节点删除
                int x=cur.next.val;
                while(cur.next!=null&&cur.next.val==x){
                    cur.next=cur.next.next;
                }
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/zhangsanM/p/16407161.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!