删除链表的节点
题目1. 在O(1)时间内删除链表节点
给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点与函数的定义如下:
public static class ListNode{
public int data;
public ListNode next;
public ListNode(int data, ListNode next){
this.data=data;
this.next=next;
}
}
思路
将要删除节点的next节点直接复制到该节点上。删除原先的next节点
代码
public void deleteNode(ListNode head, ListNode, node){
if(node.next==null){
while(head.next!=node){
head=head.next;
}
head.next=null;
}
else if(head==node){
head=null;
}
else{
node.data=node.next.data;
node.next=node.next.next;
}
}
题目2 删除链表中重复的节点
在一个排序的链表中,如何删除重复的节点?
思路
我们需要设置一个preNode来记录当前节点的前一个节点。如果当前节点的值与下一个节点的值相等的话,就把preNode和下一个节点的下一个节点所连接起来。
代码
public void deleteDuplication(ListNode pHead){
if(pHead == null || pHead.next ==null)
{
return;
}
ListNode preNode=null;
ListNode curNode=pHead;
while(curNode!=null){
boolean needDelete = false;
if(curNode.next!=null && curNode.val==curNode.next.val)
needDelete = true;
if(!needDelete){
preNode=curNode;
curNode= cureNode.next;
}
else{
int dupValue = curNode.val;
ListNode toBeDel= curNode;
while(teBeDel!=null && tobeDel.val == dupvalue){
toBeDel=toBeDel.next;
}
if(preNode==null){
pHead = toBeDel;
}else{
preNode.next=toBelDel;
}
curNode = toBeDel;
}
}
}