迭代法
- 怎么一步步穿针引线呢?
- 在遍历结点时,指针head 在推进,要维护一个虚拟头结点,它指向最初的head,确保能通过它找到头结点
- 当遇到 head.Val == head.Next.Val 时,开启循环删除 head.Next,通过 head.Next = head.Next.Next,直到不再值重复,那么此时和 head 重复的结点已经删完,就要继续推进 head,处理考察后面的结点
- 于是 head = head.Next,最后循环结束,整个链处理完毕,返回虚拟头结点的Next。
代码 golang
func deleteDuplicates( head *ListNode ) *ListNode { // 创建虚拟头结点 dummy := new(ListNode) dummy.Next = head // 开启循环 for head != nil && head.Next != nil { // 如果当前结点和下一结点的值相同 if head.Val == head.Next.Val { // 则开启循环删除head.Next for head.Next != nil && head.Val == head.Next.Val { head.Next = head.Next.Next } } // 现在处理完与head相同的结点,继续推进 head = head.Next } return dummy.Next }
递归法
deleteDuplicates 函数其实在 “治理” 头结点为 head 的链表,返回出新的链表
我们遍历结点,跳过重复的结点,来到不重复的结点,那么我们要“治理”从该点开始的链表
即 head.Next = deleteDuplicates(不重复的结点)
最后返回 head 即可
代码 golang
func deleteDuplicates(head *ListNode) *ListNode { // 特判 if head == nil || head.Next == nil { return head } // 开启循环 if head.Val == head.Next.Val { for head.Next != nil && head.Val == head.Next.Val { head = head.Next } } head.Next = deleteDuplicates(head.Next) return head }