(LeetCode83)删除链表中重复的结点1
题目描述:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 :
- 输入: 1->1->2->3->3
- 输出:1->2->3
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null){
return null;
}
ListNode p1 = head;
ListNode p2 = head.next;
while(p2 != null){
if(p1.val == p2.val){
while(p2 != null && p2.val == p1.val){
p2 = p2.next;
}
}
p1.next = p2;
p1 = p2;
if(p2 != null){
p2 = p2.next;
}
}
return head;
}
}
(LeetCode82)删除链表中重复的结点2
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,
- 链表1->2->3->3->5
- 处理后为 1->2->5
思路:定义三个结点,prev 始终指向新链表的前一个结点,p1 和 p2 用来遍历链表,比较值是否相等。
注意:如果链表为空,直接返回 null,如果前两个结点的值相等,则要更新 head 的指向,保证 head 一定指向删除重复的结点之后的新链表。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null){
return null;
}
ListNode prev = null;
ListNode p1 = head;
ListNode p2 = head.next;
while(p2 != null){
if(p1.val != p2.val){
prev = p1;
p1 = p2;
p2 = p2.next;
}else{
while(p2 != null && p2.val == p1.val){
p2 = p2.next;
}
if(prev == null){
head = p2;
}else{
prev.next = p2;
}
p1 = p2;
if(p2 != null){
p2 = p2.next;
}
}
}
return head;
}
}