《剑指offer》面试题13:在O(1)时间删除链表结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。

情况:

  1. 链表长度为1,删除是头结点且尾结点。
  2. 链表长度为n,删除是头结点。
  3. 链表长度为n,删除是尾结点。
  4. 链表长度为n,删除中间结点。

思路:将上述4种情况进行合并处理,可减少if个数。

注意:

  1. node删除后置空。
  2. 链表中没有node。
  3. 特殊情况的考虑。

方法一:

从尾到头考虑,如果不是尾节点(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;
	} 
}

猜你喜欢

转载自blog.csdn.net/qq_25024883/article/details/79609524