删除链表中重复的节点***
题目描述
| 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。 |
思路1
程序
/**
* code1
* 时间复杂度:O(),空间复杂度:O()
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if (pHead == null) {
return null;
}
// 新建一个节点,防止头结点被删除
ListNode dummy = new ListNode(-1);
dummy.next = pHead;
ListNode p = pHead;
// 指向前一个节点
ListNode preNode = dummy;
while (p != null && p.next != null) {
if (p.val == p.next.val) {
int val = p.val;
// 向后重复查找
while (p != null && p.val == val) {
p = p.next;
}
// 赋值:相当于删除
preNode.next = p;
}else {
// 如果当前节点和下一个节点值不等,则向后移动一位
preNode = p;
p = p.next;
}
}
return dummy.next;
}
}
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
思路2
程序
/**
* code2
* 时间复杂度:O(),空间复杂度:O()
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null)
return null;
if(pHead!=null&&pHead.next==null)
return pHead;
ListNode now;
if(pHead.next.val==pHead.val){
now = pHead.next.next;
while(now!=null&&now.val==pHead.val)
now= now.next;
return deleteDuplication(now);
}else{
now = pHead.next;
pHead.next=deleteDuplication(now);
return pHead;
}
}
}