思路&代码
题目已经说有序,那么说明重复的元素都是相邻,可以采取双指针法便利比较,出现重复,则将重复的节点干掉即可.没出现重复双指针同时向后移动即可.结束条件,快指针到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()
}