[leetCode]删除排序链表中的重复元素 II
解法一 指针
preNode指向当前指针的前一个节点;curNode指向当前节点;nextNode指向当前节点后的一个节点(不重复)。
- 以curNode不为null为条件,向后遍历:判断curNode与nextNode指向的节点值是否相同
- 不相同:按顺序往后移动这三个指针
- 相同:说明有重复元素,向后移动nextNode指针直到跳过所有相同节点,然后删除相同的节点。
/**
* 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 preNode = null;//当前指针的前一个指针
ListNode curNode = head;//当前指针
while(curNode != null){
ListNode nextNode = curNode.next;
boolean isNeedToBeDel = false;
if(nextNode != null && curNode.val == nextNode.val){
isNeedToBeDel = true;
}
if(!isNeedToBeDel){
preNode = curNode;
curNode = nextNode;
}else{
//移动指针直到出现不相同的节点或者空节点
while(nextNode != null && nextNode.val == curNode.val){
nextNode = nextNode.next;
}
if(preNode == null){//preNode为null说明头节点为重复节点
head = nextNode;
curNode = nextNode;
}else{
preNode.next = nextNode;
curNode = nextNode;
}
}
}
return head;
}
}
双指针 + 递归
链表的每个节点可以看作是一个新的链表,此问题可以转化为删除链表头部相同的节点:
- 如果头节点为null则返回null
- curHead指向头节点,nextNode指向之后的节点,如果两个指针指向的节点值相同则使用nextNode指针跳过相同的节点,递归删除下一条链表
- 如果该链表头节点不重复,则递归删除下一个节点所在的链表
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null) return null;
ListNode curHead = head;
ListNode nextNode = curHead.next;
if(nextNode!=null && curHead.val == nextNode.val){
while(nextNode != null && nextNode.val == curHead.val){
nextNode = nextNode.next;
}
return deleteDuplicates(nextNode);
}
head.next = deleteDuplicates(head.next);
return head;
}
}