从无头单链表中删除节点

1、从无头单链表中删除节点
一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点)。将该节点删除。
A——>B——>C——>D       =====》     A——>C——>D

问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C;
这里有个技巧,将C当做B,而B复制成C,则删除C节点即可;


2、给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来。
A——>B——>C——>D       =====》     A<——B<——C<——D 
问题解析:由于只能单向遍历,假设A——>B已经反转完成,现实现B<——C;可知由C.pNext = B即可;故每次循环需要保留B和C节点的值;

而翻转后,C无法再指向D会出现链表断裂;故在反转前要注意保留D,即C.pNext;

class ListNode
{
 int pValue;
 ListNode pNext;
 
 public ListNode(int pValue,ListNode pNext)
 {
  this.pNext = pNext;
  this.pValue = pValue;
 }
}

public class LinkListEx {
 
 public ListNode reverse(ListNode pHead)
 {
  if (pHead == null || pHead.pNext == null) 
   return pHead;
  ListNode pNodeA = pHead;
  ListNode pNodeB = pHead.pNext;
  ListNode pNodeC = pHead.pNext.pNext;
  
  pHead.pNext = null;
  
  while(pNodeB != null)
  {
   pNodeB.pNext = pNodeA;
   
   pNodeA = pNodeB;
   pNodeB = pNodeC;
   
   if (pNodeB != null)
    pNodeC = pNodeB.pNext;
  }
  
  return pNodeA;
 }
 
 public void delete(ListNode pNode)
 {
  if (pNode == null || pNode.pNext == null) 
   return;
  
  //由于题设中简化了难度,假设pNode既非头结点,也非尾节点,故其实不许进行边界判断
  ListNode pNext    = pNode.pNext;
  
  pNode.pValue = pNext.pValue;
  pNode.pNext  = pNext.pNext;
 }
 
 public static void main(String[] args)
 {
  ListNode p5 = new ListNode(5, null);
  ListNode p4 = new ListNode(4, p5);
  ListNode p3 = new ListNode(3, p4);
  ListNode p2 = new ListNode(2, p3);
  ListNode p1 = new ListNode(1, p2);
  
  LinkListEx linkListEx = new LinkListEx();
//	 linkListEx.print(linkListEx.reverse(p1));
  
  linkListEx.delete(p3);
  linkListEx.print(p1);
 }
 
 public void print(ListNode pHead)
 {
  while(pHead != null)
  {
   System.out.println(pHead.pValue + "==>");
   pHead = pHead.pNext;
  }
 }

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值