题目描述
假设给定链表1→2→3→4→5→6→7中指向第5个元素的指针,要求把结点5删掉,删除后链表变为1→2→3→4→6→7。
解题思路
要删除单链表中的一个结点p,首先需要找到结点p的前驱结点pre,然后通过pre.next=p.next来实现对结点p的删除。此题由于无法获取结点p的前驱结点,所以不能采用这种传统的方法。
(1)如果该结点为链表最后一个结点,则无法删除这个结点
(2)如果不是最后一个结点,则可以通过把其后继结点的数据复制到当前结点中,然后用删除后继结点的方法来实现。
class LNode {
/**
* 数据域
*/
int data;
/**
* 下一个结点的引用
*/
LNode next;
}
public class Test10 {
public static void printList(LNode head){
/**
* 打印链表
*/
for(LNode cur=head.next;cur!=null;cur=cur.next){
System.out.print(cur.data+" ");
}
}
public static boolean removeNode(LNode p){
/**
* @Author: JavaRecord
* @Description:给定单链表中某个结点,删除该结点
* @Param [p]
* @Return boolean
* @Date 2020/8/23
* @Time 11:03
*/
//如果结点为空,或p没有后继结点,则无法删除
if(p==null||p.next==null){
return false;
}
p.data=p.next.data;
LNode tmp=p.next;
p.next=tmp.next;
return true;
}
public static void main(String[] args){
int i = 1;
LNode head = new LNode();
head.next = null;
LNode tmp = null;
LNode cur = head;
LNode p = null;
for(;i<8;i++){
tmp = new LNode();
tmp.data = i;
tmp.next = null;
cur.next = tmp;
cur = tmp;
if(i==5){
p=tmp;
}
}
System.out.print("删除结点"+p.data+"前链表:");
printList(head);
boolean result=removeNode(p);
if(result==true){
System.out.print("\n删除结点5后链表:");
printList(head);
}
}
}
程序运行结果:
删除结点5前链表:1 2 3 4 5 6 7
删除结点5后链表:1 2 3 4 6 7
算法性能分析
不需要遍历链表,只需要完成一个数据复制与结点删除的操作,时间复杂度为O(1);只用来常数个额外指针,空间复杂度为O(1)。