算法-删除链表中的重复元素(有序练表)

思路&代码
题目已经说有序,那么说明重复的元素都是相邻,可以采取双指针法便利比较,出现重复,则将重复的节点干掉即可.没出现重复双指针同时向后移动即可.结束条件,快指针到nil即整个过程结束.

package main

import "fmt"

type ListNode struct {
	Val  int
	Next *ListNode
}

func (l *ListNode) Display() {
	for h := l; h != nil; h = h.Next {
		fmt.Println(h.Val)
	}
	fmt.Println("------------")
}

//
func delChong(head *ListNode) *ListNode {
	if head == nil {
		return nil
	}
	var p, q *ListNode = head, head.Next
	for q != nil {
		if p.Val != q.Val {
			q = q.Next
			p = p.Next
		} else {
			p.Next = q.Next
			q = p.Next
		}
	}
	return head
}

func main() {
	var head, t *ListNode = nil, nil
	for i := 0; i < 2; i++ {
		n := &ListNode{
			Val:  i,
			Next: nil,
		}
		if head == nil {
			head = n
			t = n
		} else {
			t.Next = n
			t = t.Next
		}
	}

	n := &ListNode{
		Val:  1,
		Next: nil,
	}
	t.Next = n
	t = t.Next

	n = &ListNode{
		Val:  1,
		Next: nil,
	}
	t.Next = n
	t = t.Next

	n = &ListNode{
		Val:  2,
		Next: nil,
	}
	t.Next = n
	t = t.Next

	n = &ListNode{
		Val:  4,
		Next: nil,
	}
	t.Next = n
	t = t.Next
	head.Display()
	fmt.Println("++++++++++++++++++++")
	delChong(head).Display()
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值