直接free(p),這樣行不通,由於咱們不能訪問其餘結點;java
若是咱們只能訪問該結點,能夠嘗試將該結點的後繼結點的數據複製到當前結點,而後刪除後繼結點算法
- public static boolean deleteNode (LinkListNode n) {
- if( null == n || null == n.next ) return false;
- LinkListNode next = n.next;
- n.data = next.data;
- n.next = next.next;
- return true;
- }
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Remove {
public boolean removeNode(ListNode pNode) {
// write code here
if(pNode.next == null){
return false;
}else{
pNode.val = pNode.next.val;
pNode.next = pNode.next.next;
return true;
}
}
}
可是這樣作有一個問題,若是咱們要刪除的是尾結點,這個算法就失效了,若是是尾結點,能夠考慮將這個結點置爲假的this
題目:刪除帶頭結點的單鏈表L中的結點p,p不是最後一個結點,要求時間複雜度爲O(1)。
解題思路:
若是不要求時間複雜度爲O(1),咱們能夠找出p的前驅結點,而後很容易就刪除p。spa
如今要求時間複雜度爲O(1),由於p不是最後一個結點,知道結點p咱們能夠刪除p的後繼結點,那麼咱們能夠把p的後繼結點元素的值賦給p結點元素的值。code
- //單鏈表的結點類
- class LNode{
- //爲了簡化訪問單鏈表,結點中的數據項的訪問權限都設爲public
- public int data;
- public LNode next;
- }
- public class LinkListUtli {
- public static void deleteNode(LNode p)
- {
- if(p==null||p.next==null) return;//若是p爲空或爲單鏈表中最後一個結點不符合題意,直接返回
- LNode q=p.next;//q爲p的後繼結點
- p.data=q.data;
- p.next=q.next;//從單鏈表中刪除結點q
- }
- }
拓展:若是刪除的結點p多是最後一個結點,怎麼辦。
解題思路:此時只能保證刪除結點的平均時間複雜度爲O(1),當p不是最後一個結點,時時間複雜度爲O(1),當p是最後一個結點時,時間複雜度爲O(n)。
算法實現:rem
- public class LinkListUtli {
- public static void deleteNode(LNode L,LNode p)
- {
- if(p==null||L==null) return;//若是p爲空或單鏈表L爲空不符合題意,直接返回
- if(p.next != null) //若是p不是最後一個結點
- {
- LNode q=p.next;//q爲p的後繼結點
- p.data=q.data;
- p.next=q.next;//從單鏈表中刪除結點q
- }
- else //若是p是最後一個結點
- {
- LNode pre=L;//用pre表示p的前驅結點
- while(pre.next != null) //保持pre有後繼結點
- {
- if(pre.next==p)//若是pre是p的前驅結點
- {
- pre.next=p.next;//將結點p從單鏈表中刪除
- }
- }
- }
-
- }
- }