分析
由于链表是有序的,那么相同元素一定是相邻位置的,
思路
一 首先创建一个新链表,头尾节点分别是NewHead和NewTail
二.遍历这个链表,判断当前节点是否是重复元素.
三. 如果不是重复元素,那么把这个节点插入到新的链表中
四.如果是重复元素,就直接跳过重复元素,处理下一个节点
(如何保证能够跳过所有的重复元素呢?
循环往后找,一直找到某个位置开始cur和cur.next不相等了,就说明找到了这片重复元素的末尾)
五.最后返回新链表头结点的后一节点NewHead.next就行了
public class Delete {
//给内部类加static,让内部类和List类相关,而和对象不相关
static class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
public ListNode Delete(ListNode pHead) {
ListNode newHead = new ListNode(-1);
ListNode newTail = newHead;//创建新链表的头尾节点,把不重复节点插入到新链表中
ListNode cur = pHead;
while (cur != null) {
if (cur.next != null && cur.val == cur.next.val) {
//短路求值,先判断后赋值
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
//上面while循环结束,就说明cur现在指向重复元素的最后一个元素
cur = cur.next;
} else {
//把那些不重复的元素插入到新链表的后面
newTail.next = new ListNode(cur.val);
newTail = newTail.next;
cur = cur.next;
}
}
return newHead.next;
}
}
}