QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5340|回复: 0
打印 上一主题 下一主题

【Java演示】什么是链表?数据结构

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-4 15:55 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    ( Y5 q$ B) e/ S* k5 e+ m! N
    【Java演示】什么是链表?数据结构) L/ c9 }: K, E6 D+ M0 q& R
    一、单向链表
    8 R8 k6 y5 b+ p7 k9 `# s8 H# C- E8 T; _
    1.png # Y! i- `$ L/ V- G" w
    链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。
    . h- n, P2 |. ^. W: l单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。. l) r, K# C! h
    链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。/ |5 c) x8 r# W, ]# I

    ; y. I& ]1 D1 z什么叫随机存储呢?
    # e7 @* u7 }9 L( s  m' s
    ' f6 z' @4 z0 }如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。) o; w- Z8 [4 i" W
    上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。. A0 r$ Y% D6 U5 v
    3.png
    6 n  R. ]& `, F# O$ a/ Z. ?4 y9 N5 o2 W# Z, `' c5 b4 h

    图中的箭头代表链表节点的next指针。

    链表的基本操作1. 查找节点

    在查找元素时,链表不像数组那样可以通过下标快速进行定位,只能从头节点开始向后一个一个节点逐一查找。

    4.png
    " t. E+ `6 A9 O, g; [0 T$ ^: ?4 g" D  K1 v7 J: N
    /**
    1 t3 U- g6 J8 \' l% d4 W# \     * 链表查找元素
    % ^& Z3 X9 i! P0 l( @, X     *) S3 l+ O2 R+ `6 @
         * @param index 查找的位置) B1 r& A) M; L7 G
         * @return index位置的Node对象5 K0 D) L$ j% e" h
         */* b& H, k6 B# X2 x7 T: V. t# F
        public Node get(int index) {8 i: d& i: U: E- f$ B1 y
            if (index < 0 || index > size) {
    2 B* {; z/ _1 D  i/ L4 k7 G/ w% {            throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    " w. E& E  |9 o; Y% P. k$ u# f        }
    & Q1 Y' k' s5 s8 t  P2 X' r% t) a        Node temp = head;
      J9 i5 J# y/ y4 P        for (int i = 0; i < index; i++) {9 A) S0 n9 x  u/ ~' y
                temp = temp.next;0 ~. e2 i' B- i
            }
    ' ^, J5 N6 D2 _+ J- h4 Z$ D        return temp;
    ) Z& W+ _" T1 U! |$ [    }! S# d1 j( W/ ^3 `. j

    5 ~- [+ x4 K- J4 F# E

    链表中的数据只能按顺序进行访问,最坏的时间复杂度是O(n)

    2. 更新节点 5.png
    9 U% F: J7 z% J  m! K* P' v4 M9 @: Q* D
    如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。
    1 ^& [3 ]: l- S1 ^3 v9 y4 F如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1)
    0 Q2 [3 P- `( F/**
    4 \$ P  _  ?% q1 l1 J     * 更新节点 将列表中指定位置的节点的data替换为指定的data。6 b+ N9 E! x) z4 p
         *
    1 {, |/ k; b7 U6 a3 o. r     * @param index 需要更新的节点的位置% r( J- E* ]+ Z& g  N6 R  R( h
         * @param data  新data5 f% l9 V5 K0 y& r  v& {/ }  y7 O9 w
         * @return 旧data' T8 g5 t" k7 l$ N% ]
         */8 g6 k3 `. B- D- ^8 Y
        public int set(int index, int data) {5 O" g/ K/ X: r& B% F, ]% F8 m
            Node x = get(index);$ _2 |+ i  y* b) B+ D6 h' [2 ]
            int oldVal = x.data;
    ! H* I- I6 Z6 M, X        x.data = data;
    1 u" W+ E5 p/ Q+ K& M" N: ^. D$ g4 {        return oldVal;
    , D8 W5 c( |) }; Z: {; l* [: ]    }
    " d. O7 m" W# |5 c1 f  R& z/ g" [% Y( X% F
    3. 插入节点

    只要内存空间允许,能够插入链表的元素是无穷无尽的,不需要像数组那样考虑扩容的问题。

    与数组类似,链表插入节点时,同样分为3种情况。

    • 尾部插入
    • 头部插入
    • 中间插入
      7 u5 M; X2 l& V
    3.1. 尾部插入

    尾部插入,是最简单的情况,把最后一个节点的next指针指向新插入的节点即可。

    4 J* s1 s" \" @5 h& j: O
    6.png " P- R/ W8 D- P4 E6 M0 v
    3.2. 头部插入

    头部插入,可以分成两个步骤。

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。
      5 @( L/ W: e* H: j
    7.png 0 p. t- }. S) u" X6 u3 T" G
    , U  m  R, M( l% n: E: g$ D9 X
    3.3. 中间插入

    中间插入,同样分为两个步骤。

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。
      ; B. K# R: y; T* x
    8.png
    0 r; l' G* D, T0 p' y$ Z5 s# f4 t" G; R4 C# h
    三钟情况的代码合到一起
    , b0 Y6 D! b, G2 U# R9 Y
    8 H( N% l  k. r$ v( }9 q" w/**
      |9 V6 u4 r8 G4 h& s4 H     * 链表插入元素- D3 y7 \( S* g& Z; E
         *
    " w. S, p" u( W     * @param index 插入位置2 e" B9 \/ V- ~: g* p
         * @param data  插入元素 被插入的链表节点的数据
    ; u% E6 a0 j( [/ j; _6 o$ q     */+ w0 s. z* \% s  E- m3 Q  I3 x
        public void insert(int index, int data) {9 |2 k+ |. O" r  s* w
            if (index < 0 || index > size) {
    ! n, k! k) X$ K- \" w+ h            throw new IndexOutOfBoundsException("超出链表节点范围!");* H* U- t$ Q8 {6 L9 M. `" y
            }
    " Y: K7 ?2 m3 U4 n6 s        Node insertedNode = new Node(data);8 s3 l5 i) [7 Y' _$ u( j- g
            if (size == 0) {/ I2 \* T& K; P/ @
                //空链表
    ) Q( b- I1 H1 I0 W% {; C            head = insertedNode;
      `& E: Z) m; W& z+ I# m% a% ]            last = insertedNode;% ?8 r3 V( M( G+ _- B9 T
            } else if (index == 0) {' x: {# u# r/ H( l. w
                //插入头部
    % ]/ Q, W" K7 w9 F8 b2 n* V" Y            insertedNode.next = head;
    : y0 V' d2 d8 q9 C' H            head = insertedNode;
    6 @* J3 L7 Z. f! }# _, K$ `        } else if (size == index) {
    . k  u) o$ I( M' y3 f            //插入尾部2 h8 e' {: O  L8 X
                last.next = insertedNode;( e; M% D6 L6 w+ M# c, ?/ E
                last = insertedNode;
      K1 @; y3 f6 [4 V* |        } else {
    7 W: i: T8 I% l1 t            //插入中间
    . J9 a! y- R1 D- V4 x            Node prvNode = get(index - 1);
    * Y6 C# p( |( S/ A; w$ }            insertedNode.next = prvNode.next;
    5 [3 P; w8 S. f/ K- X            prvNode.next = insertedNode;  M# J. x0 |% t+ G( m  b- d5 R/ c, l
            }
    0 s0 |$ M! b& i) I, q! ~        size++;
    % C. J, X  t" ?) e; T  S    }- z& p3 s1 x: e) I* k/ E" N
    ) u' u& T, U* I3 i& p$ t( Y
    /**
    6 R( {0 s/ V* v1 u6 u/ i  E& @0 q     * 链表插入元素! G. u, T8 O. N/ {/ h
         *
    % N7 p( U$ `& Z* F- E5 A     * @param index 插入位置
    2 R) d9 |! Y: O7 g     * @param data  插入元素 被插入的链表节点的数据
    # L3 {, K& m% i: T' Z$ Y     */
    7 t. u; S) [/ Q: P# g2 @  O    public void insert(int index, int data) {
    ; G) c& J" R' m! M+ m  _        if (index < 0 || index > size) {6 v; y7 [* ~9 j
                throw new IndexOutOfBoundsException("超出链表节点范围!");+ H: f2 N, i$ k/ ~; g' a+ J
            }1 W  x" b  g9 m( U. c9 M
            Node insertedNode = new Node(data);) Y8 B, D7 Y% ]* c3 b' F  w; d+ f
            if (size == 0) {, W" ?6 f, x% |' i3 n- Q
                //空链表2 n3 H+ s, x3 G% ?
                head = insertedNode;$ J5 u) L+ q( K+ I. {: X8 a3 R3 Q' `
                last = insertedNode;- a+ `1 g3 G# Q- ^+ ^( J" p/ J0 {1 k9 C
            } else if (index == 0) {
    $ T' V3 d7 a* Q- g! _            //插入头部
    5 o0 `/ n/ ?" d/ F            insertedNode.next = head;
    4 c7 g* T: ]5 U5 h, @9 N            head = insertedNode;4 C) x" r3 Z/ k! H
            } else if (size == index) {. H( h( x0 z  f) P1 W4 A
                //插入尾部
    ' a: q1 h7 s8 E            last.next = insertedNode;
    1 y+ V* ]! N% t6 ?8 t            last = insertedNode;1 u+ L0 i" Y0 S0 z+ o. H4 e
            } else {
    0 S) k5 Y8 @3 ~8 O- x# ?3 Q, G            //插入中间
    . t  s$ d! x) D: t1 e3 F            Node prvNode = get(index - 1);
    % a/ x" D# T8 c. y; r+ u3 @' ?! m            insertedNode.next = prvNode.next;
    ( b. \# z+ N. N1 a+ W7 {  Z            prvNode.next = insertedNode;
    ! ~4 f8 v/ R: |        }8 \( u) s5 x/ m9 m
            size++;
    2 h+ H& U" y0 i9 b0 G+ G    }7 k7 p( A$ \: B+ o2 ~
    4. 删除元素

    链表的删除操作同样分为3种情况。

    • 尾部删除
    • 头部删除
    • 中间删除
      9 i  j4 P- V  H! M
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即! C7 L4 z- C  b  R# B
    可。

    9.png
    : A1 k) ?: K2 X" g; V0 ]1 B& h0 s: Z( g* Z
    4.1. 头部删除

    头部删除,也很简单,把链表的头节点设为原先头节点的next指针即可。

    10.png
    8 N/ N( e/ O7 s& k  ]9 w/ G. @' l2 {# R- h, h. {+ e
    4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要; H+ }8 T! K6 `8 P& L
    删除元素的下一个节点即可。

    11.png 7 R& w" H( u8 [& L% n
    7 i) ?3 K* C2 G5 ^) e8 H6 H

    # K- e) |4 Q" ?* G$ m- I这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。, q' X  s( Q' s4 v
    如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1)9 T- T/ x! l9 ~1 }4 C0 |
    /**
    - {* Q5 o4 Y' U: v     * 链表删除元素- A$ ?1 S# n; `( p! O/ i
         *
    1 S9 f4 K+ }. o  s- e" S. N     * @param index 删除的位置) Q& Q& \/ H- u0 p- t* n( @; s
         * @return 被删除的节点8 n$ e9 L! r$ E$ [; a% m
         */
    5 f# R$ l4 m& D% v, B: q    public Node remove(int index) {7 b/ v0 {4 X* r5 L0 c! x
            if (index < 0 || index > size) {, Q" V4 e8 _% Y
                throw new IndexOutOfBoundsException("超出链表节点范围");
    1 ^' r; H; O7 v        }
    ) c& N7 h& }1 n1 s& w        Node removeNode;
    - E- q! z* c" a6 M        if (index == 0) {
    + o% q, y/ j; [: T3 D            if (size == 0) {% q: E3 `+ L* M( J" P: S9 P
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");
    - ~6 g, m; _  ^% T& @            }
    : H' W9 w7 @* c; J9 r: T            //删除头节点$ u4 ~; H* H% @
                removeNode = head;
    6 u1 q' H2 h8 F. j            head = head.next;
    8 M+ O2 |( J  M: L+ o! B" J        } else if (index == size - 1) {
    $ p- F' j/ F( m% ~            //删除尾节点2 a& s6 P- V4 v( l) E. t
                Node preNode = get(index - 1);# c- {3 D" e/ c& Y% q6 J$ m
                removeNode = preNode.next;
    & f) V3 y# g6 s7 j7 [            preNode.next = null;
    % l, w$ z8 m& i: W" x% f! D& A; u            last = preNode;. F( h6 }- l5 Z1 ^- ~! P/ t8 k% D
            } else {
    8 Q4 e/ O; v5 O/ y            //删除中间节点
    " \  ?, D- l. [/ C  _            Node prevNode = get(index - 1);  R$ S# c9 U7 K
                removeNode = prevNode.next;
    ( r: R7 g! S/ q) T% M4 ^/ L% U            prevNode.next = prevNode.next.next;
    1 ^% A# H& P0 f) b% K' p7 N        }
    $ d; z' x. X# a; ~: b( `        size--;' H! U4 F3 {" c9 b4 Y8 a& k
            return removeNode;5 t; m/ w7 K( G# S2 a- D
        }! O. g- A! A4 o6 ~( a6 q, u
    Java实现链表的完整代码package chapter2.part2;! P4 f3 C3 N* R

    - _2 r: T! \  z( `+ [3 N9 G* p: u/**
    3 P: c0 h( C+ C9 P; s  z  Z * Created by IntelliJ IDEA.
    8 x+ u4 X; O# p# s+ W *8 _+ W, t% H6 {, P/ j
    * @Author: 张志浩  Zhang Zhihao4 I4 J$ f. S$ ~( r
    * @Email: 3382885270@qq.com
    ' y& G2 K% f( z( i9 e * @Date: 2020/5/32 f+ A/ r) X1 p" Q
    * @Time: 13:391 H8 ^! m6 y$ Y
    * @Version: 1.02 K! [- r& P& k/ e, m( \9 W- W
    */1 `' L( j! K; l, @5 G8 S+ k
    public class MyLinkedList2 {
    $ |5 {4 D8 b2 h' m# [( H    private Node head; //头节点; k- B0 w" f; D6 H7 s. g& z7 U
        private Node last; //尾节点3 v2 u2 P: }9 A5 j
        private int size; //链表实际长度
    / J2 o9 L- S% g4 W$ q& H8 w1 u1 N% I# b# T$ j* n# E$ b7 d
        public static void main(String[] args) {( i4 h% b0 c( g- ^; x
            MyLinkedList2 myLinkedList = new MyLinkedList2();
    ; V& `: f' \6 J5 C//        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作
    + w* I% N3 i) y+ e//        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围
    ' c- E7 _' R- {7 {- w4 t        myLinkedList.insert(0, 3);. o" o4 c+ X7 ~8 }& R0 `
            myLinkedList.insert(1, 7);$ {6 @# H3 C" c5 i9 n: p
            myLinkedList.insert(2, 9);
    , [9 Y3 f. R- T7 Y( @        myLinkedList.insert(3, 5);
    5 j9 b% D, n+ p, Y9 j! w8 I        myLinkedList.insert(1, 6);" y% }, b3 V0 T2 k2 o. C( M* `4 m
            myLinkedList.remove(0);+ P0 N) v* @1 I" a
            myLinkedList.set(0, 23);9 h/ k* D9 t+ O
            myLinkedList.output();* ^& @  d. s* b) b- m! Y$ \
        }
    2 T0 w/ N) ]" {" V9 E/ I* _$ V
    - D9 B' ^# i8 X3 n6 G    /**
    6 G6 ^$ e( Q, H8 z$ a     * 链表插入元素6 A6 a+ _4 p8 s& u, q
         *
    8 n1 R7 ]) Y. r& o5 `     * @param index 插入位置( [( X/ }# h$ a6 v( e( C' H+ D
         * @param data  插入元素 被插入的链表节点的数据: M3 \& |7 i( R- F' ?& d
         */5 u' m; ~/ A. O; @
        public void insert(int index, int data) {
    ; c$ _6 k1 V0 t. {: M- I0 B6 u        if (index < 0 || index > size) {2 f& q5 w; W( z3 d5 W  C. {
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    6 M! h! t1 e' J+ f        }
    8 J  G3 K; x5 K8 p        Node insertedNode = new Node(data);$ {! n+ E. C) P1 S: V6 ~
            if (size == 0) {
    , y6 _4 ]3 w- K" p$ m0 ~            //空链表
    . k! M  `  {+ r* m6 c( d9 t            head = insertedNode;
    - M: \/ `6 Z9 j, Y) |            last = insertedNode;
    9 S7 f% I/ X$ e$ L; D        } else if (index == 0) {
    4 x" ^& w/ A2 f. T6 [1 U4 X& m+ N            //插入头部; M& E5 O2 ^; E0 k  h9 V& n
                insertedNode.next = head;
    , M( F% Z# X) p* E            head = insertedNode;
    # T# R; |* A& ^9 ~# B* s- m/ f3 P        } else if (size == index) {" F3 i5 U( E. J- R* P/ T
                //插入尾部
    : H% k: p4 o# Y: c0 W! I            last.next = insertedNode;
    # ?$ I+ W$ a5 g* s/ I1 H3 |            last = insertedNode;
    4 f% r, q' N8 r        } else {  u% V' S1 S: k+ H0 l7 _
                //插入中间
    1 |! Y. S$ M/ W/ L8 _2 o            Node prvNode = get(index - 1);( k1 H  h" L7 |) o% v$ c3 @4 a/ j
                insertedNode.next = prvNode.next;
    $ P- \2 ?" T( r+ a            prvNode.next = insertedNode;; P5 `9 e8 ]* [- t
            }
    * U5 P$ B( e* c, {* X- d        size++;" o9 e8 z* O  G2 K5 y
        }) p/ f+ w9 t' p! g# w% N

    , _8 n% S6 v0 L7 l8 P    /**
    5 w+ U. _  s8 F; v     * 链表删除元素
    + c1 r; `  a! V0 N$ S" r$ ?. K     *
    2 |9 ^& ?$ l& _( w/ J6 H1 {! ^     * @param index 删除的位置
    2 g$ E. h# `( V3 k4 v5 v2 G# ^) U     * @return 被删除的节点
    + ^4 k- T# f: u3 C2 p6 ]8 K+ j     */
    ; a7 k% V* `0 b; a  w: }    public Node remove(int index) {% N- M. G  j6 |: N1 g8 L. ]! }9 F
            if (index < 0 || index > size) {
    5 N: h. h. e: k4 g, W; z            throw new IndexOutOfBoundsException("超出链表节点范围");9 k/ \; u. N/ ?" Y$ y
            }6 _' C9 @1 l/ `7 U# [
            Node removeNode;
    % x9 a: F, h" s1 V  e4 G9 ~        if (index == 0) {
    8 z/ k. ^1 V7 S& v( y            if (size == 0) {% S  K! ]- ]7 ?; U' W
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");8 U4 o) |" T- B. i5 E
                }
    1 c7 U* H: d) ~2 a$ V+ T4 B7 P& B( r            //删除头节点0 L+ b3 D# o( k* I: f0 m( ]. V
                removeNode = head;
    5 `' [9 H1 q, _) l8 x            head = head.next;
    3 ?# K) r4 I3 N# A* b4 i        } else if (index == size - 1) {
    5 o+ Y4 y% H1 I0 A$ M            //删除尾节点
    # p& |) }: x5 _! H/ E            Node preNode = get(index - 1);! ~* W$ W+ }6 G% d9 h* O
                removeNode = preNode.next;* _4 h! b) N& W6 O( H
                preNode.next = null;2 s  z$ }) u& s" {7 x
                last = preNode;- Q. _: e  r% x& L
            } else {* F5 `, \1 Q5 n8 P& {, P, I
                //删除中间节点+ q$ X: X& r7 {* [
                Node prevNode = get(index - 1);9 b" F3 @( i6 M0 H, e% Y- O
                removeNode = prevNode.next;
    9 h. h0 ], I6 K* ~: S" g            prevNode.next = prevNode.next.next;
    2 }* p' {: J" l) z! u/ Y        }  J# W, k" }# _9 l2 R( y& L$ C
            size--;
    " ^* a6 z3 \5 `1 l. a3 L, }9 ^        return removeNode;8 Y4 m" g+ o$ J: L: E
        }: i+ K9 o: ^# A
    6 d# ~, ]& T3 R/ ~+ y1 p! [) b
        /**9 c& e4 @- P% B
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    5 @7 D6 y3 J! Y' a2 {! A; L     *
      W2 F5 M5 F/ X% V     * @param index 需要更新的节点的位置
    ' b& d6 m) ~' p. y2 w  o     * @param data  新data: u+ v& \. j( r2 L) \& p4 ~
         * @return 旧data( X5 y6 O5 T2 N  \9 H5 F
         */2 n, @/ [0 o! y0 g* A
        public int set(int index, int data) {( f7 R. Q" S5 c8 H# t8 \. J8 w1 `
            Node x = get(index);
    2 N: A/ ^7 h6 h, t3 v        int oldVal = x.data;
    : q4 y: S+ v/ z0 z) s        x.data = data;
    2 ~. h0 J0 f2 p: s6 @        return oldVal;
    # J5 ~" H! V& f+ L    }
    : W: p1 Y+ i) s/ \# t
    7 ~5 v; |' x" M/ n    /**
    ' `- s" L9 @, Y, V( I     * 链表查找元素
    5 q7 f" H- G2 G     *
    # n6 ^; m( \0 x% O     * @param index 查找的位置/ \" i% k2 i4 o2 [4 [
         * @return index位置的Node对象
    2 a* ^4 r2 I$ n4 E! b3 Q6 \     */2 h) y# f9 Y; }' M/ R5 j) v2 `5 Y
        public Node get(int index) {+ ?9 t0 x3 C3 ^5 @, c8 S; @2 I5 k
            if (index < 0 || index > size) {* ^9 u5 K, _  O# g! {
                throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    ! l2 R2 [- v- m5 x5 k* M        }! K* `2 d) }8 w) r9 [
            Node temp = head;$ F( ?( i0 S8 L4 X7 y* Y% \
            for (int i = 0; i < index; i++) {
    8 `% K5 [' I! X) p            temp = temp.next;
    1 M: u! \8 r7 M7 |7 f        }' H* Y  D' c0 U8 f5 T4 p6 V/ d
            return temp;+ q8 x$ J* j# n1 Y. a8 u
        }
    3 ]$ w- k, F! p7 `: Q, _
    . ?4 B( h9 e! y( D7 c* e% F    /**
    / b% K  C8 }' ~" m! Q     * 输出链表
    0 |% m+ J8 h+ e: C7 U1 m* P     */
    ) K8 R: E0 X0 v    public void output() {3 ~4 P+ \; T+ @$ ~9 L9 P: v
            Node temp = head;5 f3 }# T: T( p' J/ o! o2 t
            while (temp != null) {$ g) @& G+ t9 T, x; ]% W4 J3 u
                System.out.print(temp.data + " ");
    - ^5 P5 t( V. R; D# p& x/ E/ ?            temp = temp.next;4 u+ k2 b4 f0 v9 Z/ y
            }
    7 @6 Z/ x, s0 i    }
    8 Y0 t3 Z0 t, Q6 n4 `1 U% h* t$ w. T( F
        /**
    ! G' @  z' U2 h     * 链表节点
    ' J/ W. k9 K5 ^) M2 V     */
    # E1 o1 J1 r1 C4 g/ a    class Node {& h) ^8 \$ B) G" s
            int data;1 ^, Y: X) [% F3 D/ V; @, p& r
            Node next;
    4 M/ w  r) ^9 ?- Y: e4 G6 x
    ; g+ n* d3 F$ n8 s, l: S        Node(int data) {. k2 Y0 n, z0 ]% q3 |  x
                this.data = data;
    2 {+ S, h. m$ i. c/ h4 f        }, D+ S5 t  [% k( {
        }( J9 E8 r1 x+ `1 z
    }7 c* ]# T2 u9 n! O6 S: O1 S
    ! g& X9 W, n4 E( N  v' I

    8 [6 U" g* I8 o' Q& Z二、双向链表 12.png 9 l6 a3 D/ B1 r% ?+ @$ p
    双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。
    , H) T5 @6 T2 X3 @9 T) ^7 ?! m/ a8 n- d: `+ u
    , H  S5 P/ H  U; G4 k9 B
    ) @  x$ ^6 s& m3 q& f
    ; e$ _4 q/ X# d- o! a
    ————————————————6 V6 j! v1 Y! F: ^
    版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% ^$ B) r- z3 X* \6 W
    原文链接:https://blog.csdn.net/weixin_43124279/article/details/1059044686 r9 U- p/ e( r2 ?' o5 T- c- K

    ) @' a( J! r# k, `! N9 F. B7 e) M  P% t( ?

    2.png (256.36 KB, 下载次数: 295)

    2.png

    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-24 12:32 , Processed in 0.698747 second(s), 54 queries .

    回顶部