《剑指offer》练习-面试题18-删除链表的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/sinat_34548226/article/details/81129050