原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9104582.html
LeetCode算法第83题(难度:简单)
题目:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。(English:Given a sorted linked list, delete all duplicates such that each element appear only once.)
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
简述实现思路:这种题目涉及到链表操作,需要对链表结构比较熟悉,去除重复元素,因为是有序链表,那么重复的元素必然是并列的,那么就简单了,一次遍历,找到与前一个元素值相同的元素,将其删除即可,实现的时候需要注意一点,这里涉及节点删除操作,我们表面上要找的是重复的值的节点,实际我们需要的是该节点的上一节点,因为删除操作需要依据上一节点来操作,如下代码中的preNode,还有一点需要注意,那就是针对链表头节点和尾节点的特殊处理,此处尾节点的处理可以归结到遍历中去,但头节点的处理需要单独列出来,所有针对链表的操作,都需要对头节点和尾节点的情况进行单独思考实现,一旦与基本节点情况不一致,必须单独处理。
Java实现源码:
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution { 10 public ListNode deleteDuplicates(ListNode head) { 11 ListNode node = head; 12 ListNode preNode = null;//初始化上节点 13 while(node != null){ 14 if(preNode == null){//说明是头节点 15 preNode = head; 16 }else{ 17 if(preNode.val == node.val){//找到重复节点node,preNode为其上一节点 18 node = node.next; 19 preNode.next = node;//删除当前节点 20 }else{ 21 node = node.next; 22 preNode = preNode.next; 23 } 24 } 25 } 26 return head; 27 } 28 }
精简代码版:
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution { 10 public ListNode deleteDuplicates(ListNode head) { 11 ListNode node = head; 12 while(node != null){ 13 if(node.next == null){//末节点 14 return head; 15 } 16 if(node.val == node.next.val){ 17 node.next = node.next.next; 18 }else{ 19 node = node.next; 20 } 21 } 22 return head; 23 } 24 }