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

19 篇文章 1 订阅

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

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

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;
			}
	}

}

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

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

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;
		}
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值