ÀÖÓãµç¾º


  • ½ÌÓýÐÐÒµA¹ÉIPOµÚÒ»¹É£¨¹ÉƱ´úÂë 003032£©

    È«¹ú×Éѯ/ͶËßÈÈÏߣº400-618-4000

    LinkedListÕûÌå½á¹¹½éÉܺÍLinkedListÔ´Âë·ÖÎö

    ¸üÐÂʱ¼ä:2020Äê10ÔÂ13ÈÕ11ʱ25·Ö À´Ô´:ÀÖÓã²¥¿Í ä¯ÀÀ´ÎÊý:

    LinkedList ¼¯ºÏµ×²ãÊÇÒ»¸öË«ÏòÁ´±í½á¹¹£¬¾ßÓÐÔöɾ¿ì£¬²éѯÂýµÄ߯µã,ÄÚ²¿°üº¬´óÁ¿²Ù×÷Ê×Î²ÔªËØµÄ·½·¨¡£ÊÊÓÃÓÚ¼¯ºÏÔªËØÏÈÈëÏȳöºÍÏÈÈëºó³öµÄ³¡¾°£¬ÔÚ¶ÓÁÐÔ´ÂëÖб»Æµ·±Ê¹Óá£

    Ò»¡¢LinkedListÕûÌå¼Ü¹¹

    LinkedList µ×²ãÊý¾Ý½á¹¹ÊÇÒ»¸öË«ÏòÁ´±í£¬ÕûÌå½á¹¹ÈçÏÂͼËùʾ£º
    LinkedList½á¹¹Í¼
    ÉÏͼ´ú±íÁËÒ»¸öË«ÏòÁ´±í½á¹¹£¬¿ÉÒÔͨ¹ýÇ°ÃæµÄ½ÚµãÕÒµ½ºóÃæµÄ½Úµã,Ò²¿ÉÒÔͨ¹ýºóÃæµÄ½ÚµãÕÒµ½Ç°ÃæµÄ½Úµã

    Ïà¹Ø¸ÅÄî:

    • Node: ´ú±íÁ´ÖеÄÿ¸ö½Ú£¬Node µÄ prev ÊôÐÔ£¬´ú±íǰһ¸ö½ÚµãµÄµØÖ·£¬Node µÄnext ÊôÐÔ£¬´ú±íºóÒ»¸ö½ÚµãµÄµØÖ·£»
    • first :´ú±íË«ÏòÁ´±íµÄÍ·½Úµã£¬ËüµÄǰһ¸ö½ÚµãÊÇ null¡£
    • last: ´ú±íË«ÏòÁ´±íµÄβ½Úµã£¬ËüµÄºóÒ»¸ö½ÚµãÊÇ null£»
    • Èç¹ûÁ´±íÖÐûÓÐÈκÎÊý¾Ýʱ£¬Í·½Úµãfirst ºÍ β½Úµãlast ÊÇͬһ¸ö½Úµã£¬Ç°ºóÖ¸Ïò¶¼ÊÇ null£»
    • ÒòΪLinkedList¼¯ºÏÊǸöË«ÏòÁ´±í£¬ËùÒÔ»úÆ÷Ö»ÒªÓÐ×㹻ǿ´óµÄÄڴ棬¶ÔÓÚLinkedList¼¯ºÏ¶øÑÔÊÇûÓдóСÏÞÖÆµÄ¡£

    Á´±íÖеÄÔªËØ±»³ÆÎªNode£¬ Node±»¶¨Òå³É˽Óо²Ì¬ÄÚ²¿Àà,ÄÚÈÝÈçÏ £º

    1. private static class Node<E> {
    2. E item;// ½ÚµãÖд洢µÄÊý¾Ý
    3. Node<E> next; // ÏÂÒ»¸ö½ÚµãµÄµØÖ·
    4. Node<E> prev; // ǰһ¸ö½ÚµãµÄµØÖ·
    5. // ¹¹Ôì·½·¨³õʼ»¯²ÎÊý˳Ðò·Ö±ðÊÇ£ºÇ°Ò»¸ö½ÚµãµÄµØÖ·Öµ¡¢µ±Ç°½ÚµãÖд洢µÄÊý¾Ý¡¢ºóÒ»¸ö½ÚµãµÄµØÖ·Öµ
    6. Node(Node<E> prev, E element, Node<E> next) {
    7. this.item = element;
    8. this.next = next;
    9. this.prev = prev;
    10. }
    11. }

    ¶þ¡¢LinkedList Ô´Âë½âÎö

    2.1 Ìí¼Ó£¨ÐÂÔö£©½Úµã

    Èç¹ûÏëÔÚLinkedList¼¯ºÏÖÐÌí¼Ó½Úµã£¬ÎÒÃǰÑмÓÈëµÄ½ÚµãÌí¼Óµ½Á´±íÍ·²¿£¬Ò²¿ÉÒÔ°ÑмÓÈëµÄ½ÚµãÌí¼ÓÌí¼Óµ½Á´±íβ²¿£¬add ·½·¨Ä¬ÈÏÊÇ´Óβ²¿¿ªÊ¼Ìí¼Ó£¬addFirst ·½·¨ÊÇ´ÓÍ·²¿¿ªÊ¼Ìí¼Ó£¬ÏÂÃæ·Ö±ðÀ´¿´ÏÂÁ½ÖÖ²»Í¬µÄÌí¼Ó·½Ê½£º

    ´Óβ²¿Ìí¼Ó£¨add£©

    1. // ´Óβ²¿¿ªÊ¼Ìí¼Ó½Úµã
    2. void linkLast(E e) {
    3. // °Ñβ½ÚµãÊý¾ÝÔÝ´æ
    4. final Node<E> l = last;
    5. // н¨ÐµĽڵ㣬³õʼ»¯Èë²Îº¬Ò壺
    6. // l ÊÇнڵãµÄǰһ¸ö½Úµã£¬µ±Ç°ÖµÊÇβ½ÚµãÖµ
    7. // e ±íʾµ±Ç°ÐÂÔö½Úµã£¬µ±Ç°ÐÂÔö½ÚµãºóÒ»¸ö½ÚµãÊÇ null
    8. final Node<E> newNode = new Node<>(l, e, null);
    9. // н¨½ÚµãÌí¼Óµ½Î²²¿
    10. last = newNode;
    11. //Èç¹ûÁ´±íΪ¿Õ£¨l ÊÇβ½Úµã£¬Î²½ÚµãΪ¿Õ£¬Á´±í¼´¿Õ£©£¬Í·²¿ºÍβ²¿ÊÇͬһ¸ö½Úµã£¬¶¼ÊÇн¨µÄ½Úµã
    12. if (l == null)
    13. first = newNode;
    14. //·ñÔò°Ñǰβ½ÚµãµÄÏÂÒ»¸ö½Úµã£¬Ö¸Ïòµ±Ç°Î²½Úµã¡£
    15. else
    16. l.next = newNode;
    17. size++;//¼¯ºÏÔªËØÊýÁ¿Ôö¼Ó1
    18. modCount++;//ʵ¼ÊÐ޸ĴÎÊýÔö¼Ó1
    19. }

    ´ÓÔ´ÂëÉÏÀ´¿´£¬Î²²¿Ìí¼Ó½Úµã±È½Ï¼òµ¥.

    ´ÓÍ·²¿Ìí¼Ó£¨addFirst£©

    1. // ´ÓÍ·²¿Ìí¼Ó
    2. private void linkFirst(E e) {
    3. // Í·½Úµã¸³Öµ¸øÁÙʱ±äÁ¿
    4. final Node<E> f = first;
    5. // н¨½Úµã£¬Ç°Ò»¸ö½ÚµãÖ¸Ïònull£¬e ÊÇн¨½Úµã£¬f ÊÇн¨½ÚµãµÄÏÂÒ»¸ö½Úµã£¬Ä¿Ç°ÖµÊÇÍ·½ÚµãµÄÖµ
    6. final Node<E> newNode = new Node<>(null, e, f);
    7. // н¨½Úµã³ÉΪͷ½Úµã
    8. first = newNode;
    9. // Í·½ÚµãΪ¿Õ£¬¾ÍÊÇÁ´±íΪ¿Õ£¬Í·Î²½ÚµãÊÇÒ»¸ö½Úµã
    10. if (f == null)
    11. last = newNode;
    12. //ÉÏÒ»¸öÍ·½ÚµãµÄǰһ¸ö½ÚµãÖ¸Ïòµ±Ç°½Úµã
    13. else
    14. f.prev = newNode;
    15. size++;
    16. modCount++;
    17. }

    Í·²¿Ìí¼Ó½ÚµãºÍβ²¿Ìí¼Ó½Úµã·Ç³£ÀàËÆ£¬Ö»ÊÇǰÕßÊÇÒÆ¶¯Í·½ÚµãµÄ prev Ö¸Ïò£¬ºóÕßÊÇÒÆ¶¯Î²½ÚµãµÄ next Ö¸Ïò¡£

    2.2 ɾ³ý½Úµã

    ½Úµãɾ³ýµÄ·½Ê½ºÍÌí¼ÓÀàËÆ£¬ÎÒÃÇ¿ÉÒÔÑ¡Ôñ´ÓÍ·²¿É¾³ý£¬Ò²¿ÉÒÔÑ¡Ôñ´Óβ²¿É¾³ý£¬É¾³ý²Ù×÷»á°Ñ½ÚµãµÄÖµ£¬Ç°ºóÖ¸Ïò½Úµã¶¼ÖÃΪ null£¬°ïÖú GC ½øÐлØÊÕ¡£

    ´ÓÍ·²¿É¾³ý

    1. //´Óͷɾ³ý½Úµã f ÊÇÁ´±íÍ·½Úµã
    2. private E unlinkFirst(Node<E> f) {
    3. // ÄóöÍ·½ÚµãµÄÖµ£¬×÷Ϊ·½·¨µÄ·µ»ØÖµ
    4. final E element = f.item;
    5. // ÄóöÍ·½ÚµãµÄÏÂÒ»¸ö½Úµã
    6. final Node<E> next = f.next;
    7. //°ïÖú GC »ØÊÕÍ·½Úµã
    8. f.item = null;
    9. f.next = null;
    10. // Í·½ÚµãµÄÏÂÒ»¸ö½Úµã³ÉΪͷ½Úµã
    11. first = next;
    12. //Èç¹û next Ϊ¿Õ£¬±íÃ÷Á´±íΪ¿Õ
    13. if (next == null)
    14. last = null;
    15. //Á´±í²»Îª¿Õ£¬Í·½ÚµãµÄǰһ¸ö½ÚµãÖ¸Ïò null
    16. else
    17. next.prev = null;
    18. //ÐÞ¸ÄÁ´±í´óСºÍ°æ±¾
    19. size--;
    20. modCount++;
    21. return element;
    22. }

    ´Óβ²¿É¾³ý½ÚµãµÄ´úÂëÒ²ÊÇÀàËÆµÄ£¬ÕâÀï¾Í²»ÔÙÏêϸ½âÊÍÁË¡£

    ´ÓÔ´ÂëÖÐÎÒÃÇ¿ÉÒÔÁ˽⵽£¬Á´±í½á¹¹µÄ½ÚµãÐÂÔö¡¢É¾³ý¶¼·Ç³£¼òµ¥£¬½ö½ö°Ñǰºó½ÚµãµÄÖ¸ÏòÐÞ¸ÄϾͺÃÁË£¬ËùÒÔ LinkedList ÐÂÔöºÍɾ³ýËٶȺܿì¡£

    2.3 ²éѯ½Úµã

    ÔÚÁ´±í²éѯijһ¸ö½ÚµãÊDZȽÏÂýµÄ£¬ÒòΪÐèÒª°¤¸öÑ­»·²éÕÒ²ÅÐУ¬ÎÒÃÇ¿´¿´ LinkedList µÄÔ´ÂëÊÇÈçºÎѰÕÒ½ÚµãµÄ£º

    1. // ¸ù¾ÝÁ´±íË÷ÒýλÖòéѯ½Úµã
    2. Node<E> node(int index) {
    3. // Èç¹û index ´¦ÓÚ¶ÓÁеÄǰ°ë²¿·Ö£¬´ÓÍ·¿ªÊ¼ÕÒ£¬size >> 1 ÊÇ size ³ýÒÔ 2 µÄÒâ˼¡£
    4. if (index < (size >> 1)) {
    5. Node<E> x = first;
    6. // Ö±µ½ for Ñ­»·µ½ index µÄǰһ¸ö node Í£Ö¹
    7. for (int i = 0; i < index; i++)
    8. x = x.next;
    9. return x;
    10. } else {// Èç¹û index ´¦ÓÚ¶ÓÁеĺó°ë²¿·Ö£¬´Óβ¿ªÊ¼ÕÒ
    11. Node<E> x = last;
    12. // Ö±µ½ for Ñ­»·µ½ index µÄºóÒ»¸ö node Í£Ö¹
    13. for (int i = size - 1; i > index; i--)
    14. x = x.prev;
    15. return x;
    16. }
    17. }

    ´ÓÔ´ÂëÖÐÎÒÃÇ¿ÉÒÔ·¢ÏÖ£¬LinkedList ²¢Ã»ÓвÉÓôÓÍ·Ñ­»·µ½Î²µÄ×ö·¨£¬¶øÊDzÉÈ¡Á˼òµ¥¶þ·Ö·¨£¬Ê×ÏÈ¿´¿´ index ÊÇÔÚÁ´±íµÄǰ°ë²¿·Ö£¬»¹ÊǺó°ë²¿·Ö¡£Èç¹ûÊÇǰ°ë²¿·Ö£¬¾Í´ÓÍ·¿ªÊ¼Ñ°ÕÒ£¬·´Ö®ÒàÈ»¡£Í¨¹ýÕâÖÖ·½Ê½£¬Ê¹Ñ­»·µÄ´ÎÊýÖÁÉÙ½µµÍÁËÒ»°ë£¬Ìá¸ßÁ˲éÕÒµÄÐÔÄÜ£¬ÕâÖÖ˼ÏëÖµµÃÎÒÃÇ½è¼ø¡£

    2.4 µü´úÆ÷

    ÒòΪ LinkedList ҪʵÏÖË«ÏòµÄµü´ú·ÃÎÊ£¬ËùÒÔÎÒÃÇʹÓà Iterator ½Ó¿Ú¿Ï¶¨²»ÐÐÁË£¬ÒòΪ Iterator Ö»Ö§³Ö´ÓÍ·µ½Î²µÄ·ÃÎÊ¡£Java ÐÂÔöÁËÒ»¸öµü´ú½Ó¿Ú£¬½Ð×ö£ºListIterator£¬Õâ¸ö½Ó¿ÚÌṩÁËÏòǰºÍÏòºóµÄµü´ú·½·¨£¬ÈçÏÂËùʾ£º

    µü´ú˳Ðò ·½·¨
    ´Óβµ½Í·µü´ú·½·¨ hasPrevious¡¢previous¡¢previousIndex
    ´ÓÍ·µ½Î²µü´ú·½·¨ hasNext¡¢next¡¢nextIndex

    LinkedList ʵÏÖÁË ListIterator ½Ó¿Ú£¬ÈçÏÂͼËùʾ£º

    1. // Ë«Ïòµü´úÆ÷
    2. private class ListItr implements ListIterator<E> {
    3. private Node<E> lastReturned;//ÉÏÒ»´ÎÖ´ÐÐ next() »òÕß previos() ·½·¨Ê±µÄ½ÚµãλÖÃ
    4. private Node<E> next;//ÏÂÒ»¸ö½Úµã
    5. private int nextIndex;//ÏÂÒ»¸ö½ÚµãµÄλÖÃ
    6. //expectedModCount£ºÆÚÍû°æ±¾ºÅ£»modCount£ºÄ¿Ç°×îа汾ºÅ
    7. private int expectedModCount = modCount;
    8. ¡­¡­¡­¡­
    9. }

    ÎÒÃÇÏÈÀ´¿´Ï´ÓÍ·µ½Î²·½ÏòµÄµü´ú£º

    1. // Åжϻ¹ÓÐûÓÐÏÂÒ»¸öÔªËØ
    2. public boolean hasNext() {
    3. return nextIndex < size;// ÏÂÒ»¸ö½ÚµãµÄË÷ÒýСÓÚÁ´±íµÄ´óС£¬¾ÍÓÐ
    4. }
    5. // È¡ÏÂÒ»¸öÔªËØ
    6. public E next() {
    7. //¼ì²éÆÚÍû°æ±¾ºÅÓÐÎÞ·¢Éú±ä»¯
    8. checkForComodification();
    9. if (!hasNext())//Ôٴμì²é
    10. throw new NoSuchElementException();
    11. // next Êǵ±Ç°½Úµã£¬ÔÚÉÏÒ»´ÎÖ´ÐÐ next() ·½·¨Ê±±»¸³ÖµµÄ¡£
    12. // µÚÒ»´ÎÖ´ÐÐʱ£¬ÊÇÔÚ³õʼ»¯µü´úÆ÷µÄʱºò£¬next ±»¸³ÖµµÄ
    13. lastReturned = next;
    14. // next ÊÇÏÂÒ»¸ö½ÚµãÁË£¬ÎªÏ´εü´ú×ö×¼±¸
    15. next = next.next;
    16. nextIndex++;
    17. return lastReturned.item;
    18. }

    ÉÏÊöÔ´ÂëµÄ˼·¾ÍÊÇÖ±½ÓÈ¡µ±Ç°½ÚµãµÄÏÂÒ»¸ö½Úµã£¬¶ø´Óβµ½Í·µü´úÉÔ΢¸´ÔÓÒ»µã£¬ÈçÏ£º

    1. // Èç¹ûÉϴνڵãË÷ÒýλÖôóÓÚ 0£¬¾Í»¹Óнڵã¿ÉÒÔµü´ú
    2. public boolean hasPrevious() {
    3. return nextIndex > 0;
    4. }
    5. // ȡǰһ¸ö½Úµã
    6. public E previous() {
    7. checkForComodification();
    8. if (!hasPrevious())
    9. throw new NoSuchElementException();
    10. // next Ϊ¿Õ³¡¾°£º1:˵Ã÷ÊǵÚÒ»´Îµü´ú£¬È¡Î²½Úµã(last);2:ÉÏÒ»´Î²Ù×÷°Ñβ½Úµãɾ³ýµôÁË
    11. // next ²»Îª¿Õ³¡¾°£ºËµÃ÷ÒѾ­·¢Éú¹ýµü´úÁË£¬Ö±½Óȡǰһ¸ö½Úµã¼´¿É(next.prev)
    12. lastReturned = next = (next == null) ? last : next.prev;
    13. // Ë÷ÒýλÖñ仯
    14. nextIndex--;
    15. return lastReturned.item;
    16. }

    ÕâÀ︴ÔÓµãÌåÏÖÔÚÐèÒªÅÐ¶Ï next ²»Îª¿ÕºÍΪ¿ÕµÄ³¡¾°£¬´úÂë×¢ÊÍÖÐÓÐÏêϸµÄÃèÊö¡£

    µü´úÆ÷ɾ³ý

    LinkedList ÔÚɾ³ýÔªËØÊ±£¬Ò²ÍƼöͨ¹ýµü´úÆ÷½øÐÐɾ³ý£¬É¾³ý¹ý³ÌÈçÏ£º

    1. public void remove() {
    2. checkForComodification();
    3. // lastReturned ÊDZ¾´Îµü´úÐèҪɾ³ýµÄÖµ£¬·ÖÒÔÏ¿պͷǿÕÁ½ÖÖÇé¿ö£º
    4. // lastReturned Ϊ¿Õ£¬ËµÃ÷µ÷ÓÃÕßûÓÐÖ÷¶¯Ö´Ðйý next() »òÕß previos()£¬Ö±½Ó±¨´í
    5. // lastReturned ²»Îª¿Õ£¬ÊÇÔÚÉÏ´ÎÖ´ÐÐ next() »òÕß previos()·½·¨Ê±¸³µÄÖµ
    6. if (lastReturned == null)
    7. throw new IllegalStateException();
    8. Node<E> lastNext = lastReturned.next;
    9. //ɾ³ýµ±Ç°½Úµã
    10. unlink(lastReturned);
    11. // next == lastReturned µÄ³¡¾°·ÖÎö£º´Óβµ½Í·µÝ¹é˳Ðò£¬²¢ÇÒÊǵÚÒ»´Îµü´ú£¬²¢ÇÒҪɾ³ý×îºóÒ»¸öÔªËØµÄÇé¿öÏÂ
    12. // ÕâÖÖÇé¿öÏ£¬previous() ·½·¨ÀïÃæÉèÖÃÁË lastReturned = next = last,ËùÒÔ next ºÍ lastReturned»áÏàµÈ
    13. if (next == lastReturned)
    14. // Õâʱºò lastReturned ÊÇβ½Úµã£¬lastNext ÊÇ null£¬ËùÒÔ next Ò²ÊÇ null£¬ÕâÑùÔÚ previous() Ö´ÐÐʱ£¬·¢ÏÖ next ÊÇ null£¬¾Í»á°Ñβ½Úµã¸³Öµ¸ø next
    15. next = lastNext;
    16. else
    17. nextIndex--;
    18. lastReturned = null;
    19. expectedModCount++;
    20. }

    ×ܽá

    LinkedList ÊÊÓÃÓÚÒªÇóÓÐ˳Ðò¡¢²¢ÇһᰴÕÕ˳Ðò½øÐеü´úµÄ³¡¾°£¬Ö÷ÒªÊÇÒÀÀµÓڵײãµÄÁ´±í½á¹¹£¬ÔÚÃæÊÔÖÐµÄÆµÂÊ»¹ÊÇÂù¸ßµÄ£¬ÏàÐÅÀíÇå³þÉÏÃæµÄÔ´Âëºó£¬Ó¦¶ÔÃæÊÔÓ¦¸ÃûÓÐÎÊÌâ¡£

    ²ÂÄãϲ»¶

    javaÅàѵ£ºLinkedListµÄÔ­Àí½éÉÜ
    ºÚÂí³ÌÐòÔ±javaÅàѵ¿Î³Ì

    0 ·ÖÏíµ½£º
    ºÍÎÒÃÇÔÚÏß½»Ì¸£¡
    ¡¾ÍøÕ¾µØÍ¼¡¿¡¾sitemap¡¿