一、删除排序链表中的重复元素
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例
解题思路
因为列表已排好序,所以是排序链表,直接按照遍历就可以
```go
func deleteDuplicates(head *ListNode) *ListNode {
//判断边界条件
if head == nil {
return nil
}
//新建表头
dummynode := &ListNode{0, head}
cur := dummynode
//当前节点和下一节点不为空
for cur.Next != nil && cur.Next.Next != nil {
//如果当前节点的值等于下一节点的值
if cur.Next.Val == cur.Next.Next.Val {
//取出该点的值
x := cur.Next.Val
//当前节点不等于空,且当前节点值==x,则将当前节点删除
for cur.Next != nil && cur.Next.Val == x {
cur.Next = cur.Next.Next
}
//如果两个节点值不相等,则遍历下一个
} else {
cur= cur.Next
}
}
//返回当头节点的下一节点
return dummynode.Next
}
二、删除无序链表中的重复元素
示例
无序链表中删除重复元素,通过双循环直接在链表上进行删除操作,外循环用一个指针从第一个节点开始遍历整个链表,
然后内循环用另外一个指针遍历其余节点,将与外层循环遍历到的指针所指节点的数据域相同的节点删除。
```go
func RemoveDup(head *LinkList.Node) {
if head == nil || head.Next == nil {
return
}
outCur := head.Next //用于外层循环
var innerCur *LinkList.Node //用于内循环遍历outCur后面的节点
var innerPre *LinkList.Node //内循环当前节点的前驱节点
for ; outCur != nil; outCur = outCur.Next {
for innerCur, innerPre = outCur.Next, outCur; innerCur != nil; {
if outCur.Data == innerCur.Data {
innerPre.Next = innerCur.Next
innerCur = innerCur.Next
} else {
innerPre = innerCur
innerCur = innerCur.Next
}
}
}
}