站在Java的角度看LinkedList

本文深入探讨了Java中链表的实现原理,包括单链表的反转算法,并通过具体的代码示例展示了如何使用双向链表来实现队列。此外,还介绍了在处理数组问题时的一般性策略。

站在Java的角度看,玩队列不就是玩对象引用对象嘛!

 

Java代码  收藏代码
  1. public class LinkedList<E> implements List<E>, Deque<E> {  
  2.   Node<E> first;  
  3.   Node<E> last;  
  4.   int size;  
  5.   
  6.   public boolean add(E e) {  
  7.         final Node<E> l = last;  
  8.         final Node<E> newNode = new Node<>(l, e, null);  
  9.         last = newNode;  
  10.         if (l == null)  
  11.             first = newNode;  
  12.         else  
  13.             l.next = newNode;  
  14.         size++;  
  15.         modCount++;  
  16.         return true;  
  17.     }  
  18.   
  19.   private static class Node<E> {  
  20.         E item;  
  21.         Node<E> next;  
  22.         Node<E> prev;  
  23.   
  24.         Node(Node<E> prev, E element, Node<E> next) {  
  25.             this.item = element;  
  26.             this.next = next;  
  27.             this.prev = prev;  
  28.         }  
  29.     }   
  30. }  

 单链表反转:

Java代码  收藏代码
  1. /**   
  2.      * 递归,在反转当前节点之前先反转后续节点   
  3.      */    
  4.     public static Node reverse(Node head) {    
  5.         if (null == head || null == head.getNextNode()) {    
  6.             return head;    
  7.         }    
  8.         Node reversedHead = reverse(head.getNextNode());    
  9.         head.getNextNode().setNextNode(head);    
  10.         head.setNextNode(null);    
  11.         return reversedHead;    
  12.     }    
  13.     
  14.     /**   
  15.      * 遍历,将当前节点的下一个节点缓存后更改当前节点指针   
  16.      *    
  17.      */    
  18.     public static Node reverse2(Node head) {    
  19.         if (null == head) {    
  20.             return head;    
  21.         }    
  22.         Node pre = head;    
  23.         Node cur = head.getNextNode();    
  24.         Node next;    
  25.         while (null != cur) {    
  26.             next = cur.getNextNode();    
  27.             cur.setNextNode(pre);    
  28.             pre = cur;    
  29.             cur = next;    
  30.         }    
  31.         //将原链表的头节点的下一个节点置为null,再将反转后的头节点赋给head       
  32.         head.setNextNode(null);    
  33.         head = pre;    
  34.             
  35.         return head;    
  36.     }  

 对于数组问题,一般我们要新建数组,必要时移动下标


原文链接:[http://wely.iteye.com/blog/2326330]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值