题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
来源:牛客网
思路一:非递归
1. 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况
2.设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。
package offer;
public class Solution18 {
public ListNode deleteDuplication1(ListNode pHead) {
if (pHead == null || pHead.next == null)
return pHead;
// 添加一个头节点,以方便处理第一个和第二个节点相同的情况
ListNode Head = new ListNode(0);
Head.next = pHead;
ListNode pre = Head;
ListNode last = Head.next;
// 遍历链表
while (last != null) {
if (last.next != null && last.val == last.next.val) {
while (last.next != null && last.val == last.next.val) {
last = last.next;
}
pre.next = last.next;
// 注意这里赋的是pre.next,而不是pre
// 说明pre后的next指针如果还是指向一个重复的数,可以将next指针继续改为last.next
last = last.next;
} else {
pre = pre.next;
last = last.next;
}
}
return Head.next;
}
}
思路二:递归
package offer;
public class Solution18 {
public ListNode deleteDuplication(ListNode pHead) {
if (pHead == null || pHead.next == null)
return pHead;
if (pHead.val == pHead.next.val) { //如果当前结点是重复的
ListNode pNode = pHead.next;
// 跳过与当前结点相同的全部结点,找到第一个与当前结点不同的结点
while (pNode != null && pNode.val == pHead.val) {
pNode = pNode.next;
}
return deleteDuplication(pNode); // 从第一个与当前结点不同的结点开始递归
} else { // 当前结点不是重复结点
pHead.next = deleteDuplication(pHead.next); // 保留当前结点,从下一个结点开始递归
return pHead;
}
}
}