// 直接使用原来的链表来进行删除操作 funcremoveElements(head *ListNode, val int) *ListNode { // 1.需要首先对头结点进行处理,判断头节点是否相等 // 这个循环会移除所有值为 val 的前导节点。执行完毕后,head 要么是 nil (如果所有节点都被移除了),要么指向第一个值不等于 val 的节点。 for head != nil && head.Val == val { head = head.Next } // 2不能直接操作头节点,头结点遍历会导致值不断变化,最后返回的就是最后一个值,这里需要用cur作为临时指针节点指向头节点; cur := head for cur != nil && cur.Next != nil { if cur.Next.Val == val { cur.Next = cur.Next.Next } else { cur = cur.Next } } return head }
// 虚拟头节点做法, funcremoveElements(head *ListNode, val int) *ListNode { dummyHead := &ListNode{} dummyHead.Next = head cur := dummyHead for cur != nil && cur.Next != nil { if cur.Next.Val == val { cur.Next = cur.Next.Next } else { cur = cur.Next } } return dummyHead.Next }
// 2.迭代+双指针 funcreverseList(head *ListNode) *ListNode { cur := head var pre *ListNode for cur != nil { //for cur.Next != nil { next := cur.Next cur.Next = pre pre = cur cur = next }
return pre // 不应该返回head,最后返回新的头引用pre //return head }
// 3.递归(判断是否有最小子问题)递归最主要找边界条件与非边界条件,最后得到就i是最小子问题的结果 funcreverseList(head *ListNode) *ListNode { // 1. 递归终止条件也就是边界条件 if head == nil || head.Next == nil { return head } var p = reverseList(head.Next) //反转 head.Next.Next = head head.Next = nil return p }