题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
情况:
- 链表长度为1,删除是头结点且尾结点。
- 链表长度为n,删除是头结点。
- 链表长度为n,删除是尾结点。
- 链表长度为n,删除中间结点。
思路:将上述4种情况进行合并处理,可减少if个数。
注意:
- node删除后置空。
- 链表中没有node。
- 特殊情况的考虑。
方法一:
从尾到头考虑,如果不是尾节点(n头,n中),如果是头(1头尾),如果是尾(n尾)。
public void deleteNode(ListNode head, ListNode node) { if (head == null || node == null) return ; // 要删除的点不是尾节点 if (node.next != null) { node.val = node.next.val; node.next = node.next.next; } // 只有一个节点,删除头节点 else if (head == node) { head = head.next; node = null; } // 有多个节点,删除尾节点 else { ListNode pNode = head; while (pNode.next != node) pNode = pNode.next; pNode.next = null; node = null; } }
方法二:
从头到尾考虑,如果是头结点(1头,n头),如果不是头结点(n中,n尾)。
public static void deleteNode2(ListNode head, ListNode node) { if (head == null || node == null) return ; // 要删除的点是头节点,一个或多个 if (node == head) { head = head.next; node = null; } else { ListNode pNode = head; while (pNode.next != null && pNode.next != node) pNode = pNode.next; if (pNode.next == null) // 链表中没有node return ; pNode.next = pNode.next.next; node = null; } }