链表操作总结

整理一些关于链表的操作,供自己来进行复习。

  • 反转链表
public ListNode resverse(ListNode head){
   if(head == null || head.next == null)return head;
   ListNode pre = null;
   ListNode curr = head;
   ListNode nextNode = head.next;
   while(nextNode != null){
	curr.next = pre;
	pre = curr;
	curr = nextNode;
	nextNode = nextNode.next;
  }
  curr.next = pre;
  return curr;

}

注意while循环的条件

详细链接


  • 快慢指针查找链表的一半的位置
public ListNode findHalf(ListNode head){
   if(head == null || head.next == null) return head;
   ListNode slow = head;
   ListNode fast = head;
   while(fast.next != null && fast.next.next != null){
      slow = slow.next;
      fast = fasst.next.next; 
   }
   return slow;
}

注意while循环的条件


  • 删除数据域为特定值的所有节点
public ListNode delete(ListNode head,int data){ 
   if(head == null)return head;
   //创建一个哨兵
   ListNode p = new ListNode(0);
   p.next = head;
   ListNode h = p;
   //开始查找
   while(h.next != null){
     if(h.next.val == data) {
       h.next = h.next.next;
     }
     else{
	h = h.next;
     }
   }
   //删除哨兵
   h = p.next;
   return h;
}

这里注意,while循环里的else和else执行体是不一样的:

  • 如果哨兵所指的下一个节点的val等于data,p.next = p.next.next,不用移动p;
  • 否则,将p向前移动一位。

注意:这里设置了一个哨兵来简化操作,要灵活运行用。

详情


未完待续

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值