您的位置:首页 > 职场人生

面试题18:删除链表中的节点(JAVA实现)

2018-10-21 16:15 381 查看

题目一:在o(1)时间内删除链表节点

给定单向链表的表头指针和一个节点指针,定义一个函数在o(1)时间内删除节点。

[code]package jianzhi_offer;

public class DeleteNodeInList {
public static class ListNode{
private int data;
private ListNode next;
public ListNode(int data,ListNode next)
{
this.data = data;
this.next = next;
}
}
public static void deleteNode(ListNode head,ListNode node)
{
//1删除尾节点
if(node.next == null)
{
while(head.next!=node)
{
head = head.next;
}
head.next = null;
}
//2删除的节点是头节点
else if(node == head)
{
head = null;
}
//3删除的节点是中间的普通节点
else {
node.data = node.next.data;
node.next = node.next.next;
}

}

public static void main(String[] args) {
// TODO Auto-generated method stub
ListNode tail = new ListNode(1,null);
ListNode c = new ListNode(2,tail);
ListNode b = new ListNode(3,c);
ListNode head = new ListNode(4,b);
deleteNode(head,c);
while(head!=null)
{
System.out.println(head.data);
head = head.next;
}
}

}

题目二:删除链表中重复的节点

在一个排序的链表中,如何删除重复的节点?

[code]package jianzhi_offer;

public class DeleteDuplication {

public static class ListNode{
private int data;
private ListNode next;
public ListNode(int data,ListNode next)
{
this.data = data;
this.next = next;
}
}
public static ListNode deleteDuplication(ListNode head)
{
if(head == null || head.next == null)
return head;
ListNode preNode = null;
ListNode pNode = head;
while(pNode!=null)
{
ListNode pNext = pNode.next;
boolean needDelete = false;
if(pNext!=null && pNode.data == pNext.data)
needDelete = true;
if(!needDelete)
{
preNode = pNode;
pNode = pNode.next;
}
else {
int value = pNode.data;
ListNode toBeDelete = pNode;
while(toBeDelete!=null && toBeDelete.data == value)
{
pNext = toBeDelete.next;
toBeDelete = pNext;
}

if(preNode == null)
head = pNext;
else
preNode.next = pNext;
pNode = pNext;
}

}

return head;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ListNode tail = new ListNode(5,null);
ListNode c = new ListNode(4,tail);
ListNode b = new ListNode(4,c);
ListNode a = new ListNode(3,b);
ListNode e = new ListNode(3,a);
ListNode d = new ListNode(2,e);
ListNode head = new ListNode(1,d);
deleteDuplication(head);
while(head!=null)
{
System.out.println(head.data + " ");
head = head.next;
}
}

}

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: