一,题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 二,解决思路 1,创建一个带傀儡节点的新链表,用来保存原有链表中不重复的节点 2,遍历给定链表将不重复的节点尾插入新链表 3,遍历分为双重循环,外层循环整体循环,内部循环只是为了跳过连续几个相等的元素 三,代码实现
public ListNode deleteDuplication(ListNode pHead) {
ListNode newHead = new ListNode(-1); //创建一个带傀儡节点的新链表
ListNode newTail = newHead;
// 循环遍历链表
ListNode cur = pHead;
while (cur != null) {
// 判定 cur 是否是重复元素
// 时刻牢记, 针对某个引用进行 . 操作的时候, 必须保证该引用不能是 null
// 假设 cur 已经指向 最后一个元素了, cur.next 就是 null
// 短路求值. 左侧表达式如果为 false, 右侧就不求值了(对于逻辑与来说)
if (cur.next != null && cur.val == cur.next.val) {
// 说明 cur 指向的元素就是重复元素, 接下来就需要找到这个重复元素区间的末尾
// 最终能够跳过整个重复元素的区间
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
语言 |
方法 |
3139 |
5XV7WwkL2U |
C0t57 |
何之舟 |
4602 |
2009-09-21 10:13:50 |
// 上面的 while 循环结束, 此时 cur 就指向这片相同元素区间的最后一个位置
// 再多走一步就意味着跳过了整个相同元素的区间
cur = cur.next;
} else {
// 说明 cur 指向的元素不是重复元素
// 把这个元素插入到新链表中
newTail.next = new ListNode(cur.val);
newTail = newTail.next;
cur = cur.next;
}
}
return newHead.next;
}
|