QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5232|回复: 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

    2 }& x7 f: `+ g) U# A, \【Java演示】什么是链表?数据结构& ?( T5 B* \. K% A+ \. o! v
    一、单向链表
    4 V0 @" N/ |  K/ M6 O6 q% F" A$ c. W& h+ Z. f2 c
    1.png - _/ R. O: z  V* _
    链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干节点(node)所组成。  C$ o/ j0 _6 V
    单向 链表的每一个节点又包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。
    9 i% s4 A2 ^3 Z6 S链表的第1个节点被称为头节点,最后1个节点被称为尾节点,尾节点的next指针指向空。
    & B$ l! [$ P- u; ^
    & O) y) J( Z3 I1 o! H什么叫随机存储呢?; [2 J0 ?# j7 b- c  @) n
    $ x; m% y* s$ l' K, s% n, L
    如果说数组在内存中的存储方式是顺序存储,那么链表在内存中的存储方式则是随机存储 。
    # c! Z+ C  T  [* V7 n( B# o8 o上一节我们讲解了数组的内存分配方式,数组在内存中占用了连续完整的存储空间。而链表则采用了见缝插针的方式,链表的每一个节点分布在内存的不同位置,依靠next指针关联起来。这样可以灵活有效地利用零散的碎片空间。
    ) t/ q1 l7 E5 D" o* l1 N/ R 3.png
    / Y2 j- w6 Q6 n) t$ T, N7 u$ p+ u) @  L: I

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

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

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

    4.png
    ) _% `" f# c+ {4 Y( E( ]) A; D  {- K2 u+ T9 d$ @
    /**
    9 L2 x# N/ m/ I7 \4 c     * 链表查找元素9 m  S- {9 |" c$ h
         *
    9 q; z- E5 ^/ Y$ T0 J  ?! O     * @param index 查找的位置
    ! ~9 P4 m$ X. y% I/ H     * @return index位置的Node对象
    8 e$ ?; w, i+ p% J( `% ?' B     */
    2 N1 h) J; }; ?    public Node get(int index) {
    * `3 v, z) }% B3 C* i        if (index < 0 || index > size) {
      T) @- @+ n- R  `            throw new IndexOutOfBoundsException("超出链表的节点的范围!");
    3 o6 x4 _8 D4 Y+ V, f        }1 U  h3 m. j. ~: }- D
            Node temp = head;
    . ^8 H) k! M# _' v  U        for (int i = 0; i < index; i++) {6 Q' G2 {: M* L
                temp = temp.next;
      ]1 t% X  x$ j4 \- d' I        }
    5 L8 B9 E6 @  P' O( r        return temp;2 K2 Y3 f1 g' p8 }) e* V1 _3 I
        }3 e) e+ X2 f5 S( n) g+ d

      |* {8 O( g5 l9 W3 J$ ?

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

    2. 更新节点 5.png
    " m: o) C$ N, }, h6 Z4 ]( K2 [
    : M' l3 g* o4 W+ Z8 `+ X0 D  c如果不考虑查找节点的过程,链表的更新过程会像数组那样简单,直接把旧数据替换成新数据即可。2 ]: D) h9 O! E( k
    如果不考虑查找元素的过程,只考虑纯粹的更新节点操作,时间复杂度是O(1); V6 U  W# R$ J9 H
    /**
    9 `0 a6 n3 {5 T1 S' R- b6 L9 o5 z0 ~     * 更新节点 将列表中指定位置的节点的data替换为指定的data。
    7 ~- H6 {) x% f5 s* N. `* G     *
    - y- O" `- R7 w( a0 Q' f     * @param index 需要更新的节点的位置" q7 ?8 `; V4 N3 m
         * @param data  新data
    $ ]5 S6 N9 V# n& Z  Y     * @return 旧data! t( f0 d1 o1 Y  W
         */
    6 ]& A8 I- n# `+ g) y3 ]/ @6 p- F    public int set(int index, int data) {: a/ L" x5 ~7 Y" P/ y, k
            Node x = get(index);5 F& h1 j$ H" Q; {4 u7 ]. P, ~
            int oldVal = x.data;8 L# `' k2 T+ W1 n; G" G& p
            x.data = data;6 L1 c5 h$ Q! J
            return oldVal;3 R8 y: N2 O. Q0 l
        }5 R. h2 R' g; e8 ?& h1 X
    9 h$ s3 Q" M3 V& {$ b
    3. 插入节点

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

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

    • 尾部插入
    • 头部插入
    • 中间插入
      4 G1 o8 ]9 ^0 Q' S4 w* c* ^
    3.1. 尾部插入

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

    ( e5 F4 x/ Q7 m; b
    6.png
    : k- K5 i; R$ S1 u. z& [3.2. 头部插入

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

    • 第1步,把新节点的next指针指向原先的头节点。
    • 第2步,把新节点变为链表的头节点。, @  H. ?3 K' h; J6 C1 N
    7.png
    " S+ e& D* c3 U0 x) d; g9 g4 l9 m/ q+ |1 @" [3 T; B9 }
    3.3. 中间插入

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

    • 第1步,新节点的next指针,指向插入位置的节点。
    • 第2步,插入位置前置节点的next指针,指向新节点。
      ( n" M: ^2 x6 n9 w- I3 h' i
    8.png
    1 `" k$ j* B8 p! W* z1 n$ b) {+ @- O9 x' i/ ?9 _! W
    三钟情况的代码合到一起- b3 s3 {/ Q) k  t# G2 |5 [, x2 f% l3 S

    - C  q" F0 O0 p/**3 I. i  v3 V% ]
         * 链表插入元素
    : L1 Z4 D1 S2 |4 z. p     *1 g# F1 R% f3 j! g; F9 q% d! V0 i
         * @param index 插入位置
    " I8 ^- j! {& v     * @param data  插入元素 被插入的链表节点的数据- m  D! [! x5 j4 e( Q- p
         */
    0 ?7 q* Z. ^) T$ a; m  z    public void insert(int index, int data) {; n. r$ `' @! W8 q/ X; O# [) {9 J0 L  ]
            if (index < 0 || index > size) {2 d1 @6 j( C- S% c7 w
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    : E6 B" U  P, u        }( W/ I! W% U* }; w- I6 J  Z
            Node insertedNode = new Node(data);! r6 U* a, X4 D" W
            if (size == 0) {
    ! R. i$ J2 s; I. {4 D& J            //空链表6 A, M( o8 k1 k
                head = insertedNode;
    4 v+ ?7 [& _; p. p! B3 Q# Z* P            last = insertedNode;- b* u( C8 w  W0 J& F$ {; w+ R
            } else if (index == 0) {/ h+ ]9 _: x7 g. C
                //插入头部
    4 Q7 v9 A, G( |; e4 C            insertedNode.next = head;
    6 u0 C, O1 p8 x7 ]' `- R) \            head = insertedNode;
    7 C- @, G: `! r1 U$ J( C+ S        } else if (size == index) {, n+ Y; E1 A% X) M/ @! _: V& C5 O
                //插入尾部
    # [' b0 ~( I( K3 }- {- J            last.next = insertedNode;' ^: D* A9 s  F. E9 O
                last = insertedNode;
    1 c6 u; q! m* ], o% ^/ I        } else {9 l/ g4 b8 V& B! V$ V6 |5 F# q
                //插入中间
    ) r4 `0 f7 d3 t" O' B" `            Node prvNode = get(index - 1);; Q6 i! |5 x. Q9 u8 }1 O
                insertedNode.next = prvNode.next;2 w6 D2 M& _  k& J- [8 t
                prvNode.next = insertedNode;/ P1 O0 P6 w/ M% L/ B
            }& G* G9 e7 t/ K" M4 M
            size++;
    ( U0 Z2 E1 @5 W6 i% @( f    }
    . s- a; b; g1 S& q1 {) a% q, _6 h7 L/ ]9 U& o  ]
    /**/ Q' O6 g% f  o: j5 y' w$ S, X
         * 链表插入元素
    , [) N4 v$ `( J( W     *2 i, z& Z; }  m4 {3 Y/ S, n
         * @param index 插入位置& ~- V1 j  x) U: a. R; ?8 o
         * @param data  插入元素 被插入的链表节点的数据
    7 ], U. |$ v" L     */
    9 B' g, C; {$ @! a    public void insert(int index, int data) {( r1 o8 s/ f8 v  G3 l' M- B
            if (index < 0 || index > size) {
    # H8 D; m! L+ |* p$ P4 Y# x            throw new IndexOutOfBoundsException("超出链表节点范围!");
    0 ^! e3 V, ~& c        }& k3 `8 T8 h9 n2 U9 g1 W# ^/ j
            Node insertedNode = new Node(data);
    5 @: Q1 r8 M1 o! b0 G. Q( X5 p) {        if (size == 0) {/ a* @5 v! k+ L. h- n, i
                //空链表+ o& z7 o$ _* {5 O
                head = insertedNode;
    3 @& ~% Y  E4 q4 {5 Y# M            last = insertedNode;
    ( P" W! Y1 e& B+ f0 w( z. d5 o( W/ a        } else if (index == 0) {& W' B, h' ?; p% o5 B3 C$ f0 l/ V; h
                //插入头部: ^# p  _* J2 I
                insertedNode.next = head;5 G* |" s3 D3 [; m+ V1 A" b
                head = insertedNode;
    # F1 u. I* K" }        } else if (size == index) {
    & X5 U7 \& a, n. m            //插入尾部
    $ ^; Q4 n, o0 G& f, z9 X' b            last.next = insertedNode;& p6 h, m. M3 d' y/ ?4 c
                last = insertedNode;: h- t0 i  p2 k$ K/ x
            } else {
    # P6 M( v3 E- G5 Q( c* o1 A            //插入中间
    3 Z- X3 ]% F* G            Node prvNode = get(index - 1);1 ?- [& p% C  H& Y/ B- b- {3 I2 E
                insertedNode.next = prvNode.next;7 A* [# P1 |2 t( ?7 W
                prvNode.next = insertedNode;  i) M0 c( Y+ E- q9 T/ B
            }
    % I, I& Z! X# R* g" t        size++;+ N3 D6 i( A5 g
        }
    5 A2 q. g( Z' {4. 删除元素

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

    • 尾部删除
    • 头部删除
    • 中间删除4 U2 V/ [" Z! d0 K, s' d
    4.1. 尾部删除

    尾部删除,是最简单的情况,把倒数第2个节点的next指针指向空即
    ! @! [5 N! v$ d3 _, A! F可。

    9.png * C: m( v; A5 J9 f5 {7 s2 O

    : u& V  d& V: y( X4 F4.1. 头部删除

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

    10.png 5 z' H8 S; t, ~) y+ F

    8 x6 R) K' ^4 {2 D4.1. 中间删除

    中间删除,同样很简单,把要删除节点的前置节点的next指针,指向要2 D) C0 {& O* n
    删除元素的下一个节点即可。

    11.png 4 l; d% b- S8 ]

    : c' R( P; ^& e/ E) G8 |# J; F3 W( c8 x9 `6 n
    这里需要注意的是,许多高级语言,如Java,拥有自动化的垃圾回收机制,所以我们不用刻意去释放被删除的节点,只要没有外部引用指向它们,被删除的节点会被自动回收。; l2 y. _, P; `, A7 X2 N6 g/ @1 s2 R
    如果不考虑插入、删除操作之前查找元素的过程,只考虑纯粹的插入和删除操作,时间复杂度都是O(1)
    " f( q1 W# O; c/**
    2 ~) U6 }: p. }1 e" J; b2 S     * 链表删除元素
    ) z, U4 y) m1 K) p' [     *
    $ G7 q% L2 z  p, A) _0 I" r. A     * @param index 删除的位置
    # b1 ~: T0 p( J4 g# V  }& _3 i. ?     * @return 被删除的节点: k  Y8 P& A/ B- W. {
         */
    4 ^: l( E0 G  d+ O    public Node remove(int index) {
    8 C1 @. h, a9 t        if (index < 0 || index > size) {
    , W3 B1 C  U# U( @8 s. |) t: a/ @            throw new IndexOutOfBoundsException("超出链表节点范围");
    # H; B" A6 y# E) O% B" C9 C        }
    : [/ |6 z4 j) o9 U* T: |7 f        Node removeNode;
    9 J% B. S7 t+ S7 F/ ^. A        if (index == 0) {1 }' h+ \6 g7 I6 T
                if (size == 0) {8 D$ b2 P! x6 r4 h. @" x. n2 q" X
                    throw new NullPointerException("当前链表为空,不可以进行删除操作");# o  ~9 M: E5 W8 U6 [# w, a, H$ G
                }
    / l3 T3 ]0 o: @, c7 y" \+ k            //删除头节点$ {' \( [2 u- E2 [% c# s, b9 r
                removeNode = head;6 L% x& j6 s, H: `
                head = head.next;
    0 L) U4 p( ]7 ]7 s        } else if (index == size - 1) {
    . M& I% |& R* }- G! u            //删除尾节点# ^9 W4 T# c  n5 U6 [
                Node preNode = get(index - 1);
    7 `! |& }" X, \: `# B+ _            removeNode = preNode.next;+ j  b% A5 t" D! ~9 G) C
                preNode.next = null;
    + K6 Q$ t+ n& S+ s; }6 z            last = preNode;
    $ m6 e- `8 ?/ K! ?1 C" X& ^0 \        } else {4 S& F4 [# w0 o  F: k- s
                //删除中间节点
    2 B; C- I& P  I: l/ S; c            Node prevNode = get(index - 1);
    1 d9 }# \* [( L" P! b6 ~1 V8 _            removeNode = prevNode.next;) n' {: N; `' c3 I/ u
                prevNode.next = prevNode.next.next;* A' L3 l! p& V  T/ i
            }
    6 L# \2 T* |1 {& I        size--;& t* B) g' }; I5 b
            return removeNode;  o3 W% g. L9 I
        }
    ) @. }8 B; \% m# f& NJava实现链表的完整代码package chapter2.part2;& i  V. ?3 w/ W6 W" _5 i4 Q
    , w* W9 c6 [- ?5 H% _% E& U- j- d
    /**8 q; I+ H5 ]' z0 w2 H
    * Created by IntelliJ IDEA.. h7 e: y( l# S# j- [! k  Z
    *
    3 I( p/ u4 P/ b- c6 t( X * @Author: 张志浩  Zhang Zhihao( l6 v7 o: X7 X6 W( D
    * @Email: 3382885270@qq.com' ~  i6 _+ t; h, T6 O& `
    * @Date: 2020/5/3
    ( N# a# \& y0 K. Q( z * @Time: 13:39
    0 I; p7 o( j9 i * @Version: 1.0# D- _) {( h; v, |" S: `9 {  z
    */
    / I  `) }( D. @2 r, T+ j7 N8 Gpublic class MyLinkedList2 {7 L  m0 ^% ?, e8 f4 q4 y
        private Node head; //头节点% V3 i, Z% S, S% i
        private Node last; //尾节点
    $ q$ x9 l0 Q% d( ?8 `    private int size; //链表实际长度
    ! \; F$ J. X* n# P. B: I
    6 f/ K. ~: w0 X    public static void main(String[] args) {
    % C5 t3 T( {$ O1 |        MyLinkedList2 myLinkedList = new MyLinkedList2();. h+ ]6 i. J' g& d. T/ T! w- P
    //        myLinkedList.remove(0); // java.lang.NullPointerException: 当前链表为空,不可以进行删除操作
    - c5 {. A1 `1 p9 \4 j8 o- C& I//        myLinkedList.remove(3); // java.lang.IndexOutOfBoundsException: 超出链表节点范围
    / ?, e& V4 W6 X9 ]9 H        myLinkedList.insert(0, 3);' z, {) c$ S3 x- r; }% f
            myLinkedList.insert(1, 7);
    6 f( E3 X- z1 A0 n1 v        myLinkedList.insert(2, 9);1 a: O# O' A- s7 P2 Y
            myLinkedList.insert(3, 5);
    8 q9 T% X, A' g. G3 Q6 E5 ^. D        myLinkedList.insert(1, 6);
    ; u% \0 q0 D, n$ d- l) Z# i$ I; a        myLinkedList.remove(0);: v7 x( q( ^: ]' u
            myLinkedList.set(0, 23);
    / T" ]9 k' d: z2 b0 a5 P9 @" }        myLinkedList.output();; V* c& |7 e  Q5 p) j& [# Z
        }$ }! ^2 l* `) O( A+ b" A

    ) |5 v1 Y, G+ F& l# F7 z    /**% q1 S8 i, B2 U2 _# ^
         * 链表插入元素
    & d, L1 P5 k0 k+ S2 n     *
    . Q0 T& K0 u: r     * @param index 插入位置
    6 V$ N  p' i0 @     * @param data  插入元素 被插入的链表节点的数据
      T- H7 r# }- R- V1 h$ B2 f! B+ e     */+ t; S% s# q( t# q  _
        public void insert(int index, int data) {
    ( U/ f+ y; L+ U- N' N/ ]& S        if (index < 0 || index > size) {% ]. k. t) C# n1 N2 D
                throw new IndexOutOfBoundsException("超出链表节点范围!");
    2 T0 o+ W8 E  h$ s) D4 P: {        }3 Z- {* L3 k4 u1 i; G5 v* a
            Node insertedNode = new Node(data);
      R. A6 Y& u0 p! b( U1 N) o$ m( w        if (size == 0) {
    8 y# N3 z2 l1 V) m            //空链表% @4 p) S& q2 \1 o# B* T
                head = insertedNode;
    8 |3 }) z0 M+ N            last = insertedNode;
    3 }3 W6 l( u7 z; {! p: D& v( R        } else if (index == 0) {6 r, X4 \5 e) y' Y
                //插入头部, }# M3 I" h2 @0 N0 k; D! k
                insertedNode.next = head;
    / V& J' a: [/ h9 m# ~/ T            head = insertedNode;
    2 a3 K# a* G6 W- Q5 d7 B, \        } else if (size == index) {
    2 B/ Z9 i2 r! l' z2 @) e            //插入尾部
    3 W1 |1 q  G. J5 v- R            last.next = insertedNode;
    " ~  f5 M* p) r& C# t! f# k8 V; w            last = insertedNode;' i9 F# E, x: V0 S0 \% o  O
            } else {; t: ~& s" ~5 m* Q+ R  }9 R+ r
                //插入中间
    0 L) r# \* f4 @% P" r; ?            Node prvNode = get(index - 1);9 z% v* W9 X* s' o( D, C- m) M+ g
                insertedNode.next = prvNode.next;9 k# W# L" `: J4 K, o9 W9 |
                prvNode.next = insertedNode;
    # r- \, p. K# t6 e8 z        }
    3 m6 i* [3 h1 x, d2 W; ?+ [        size++;
    + l/ E8 V# _/ }% R  r$ g& h9 L    }
    # k9 H- |# ]) @. J" P
    2 a/ q: f* x, l8 K( g" n# q1 Y    /**
    3 W4 I" i  q, O( V( _     * 链表删除元素
    - m! m( x; l+ Z4 f; R! J, W     *% J+ v' e/ {" E
         * @param index 删除的位置7 h0 x& C+ S7 H7 r; b) e( l: x3 M
         * @return 被删除的节点
    , j6 F  k1 B0 S; J& u     */
    . y4 @6 j% l  {6 [. U* F7 _    public Node remove(int index) {
    * ^" E  r) p+ u7 }% m1 K) N: W/ _        if (index < 0 || index > size) {
    . s6 h. h1 K8 I1 M            throw new IndexOutOfBoundsException("超出链表节点范围");
    ) K& a! k, i& i4 S* O) n: X        }, w! k6 S* \0 n3 s2 j; ]) Y& b
            Node removeNode;
    " x, K! S8 O8 R, Z9 t6 c! I        if (index == 0) {
    0 D: T; u+ \" v; T. L  T            if (size == 0) {
    , i* }0 Z3 B/ [                throw new NullPointerException("当前链表为空,不可以进行删除操作");9 c0 s/ s5 M8 u& p
                }; E$ O; _! i# z+ Z. F- j9 R
                //删除头节点
    ( ~/ P' u% E, h            removeNode = head;
    & m, l' c$ e$ }6 R# `: v            head = head.next;
    / U+ Z! _* D0 g4 \5 z- F        } else if (index == size - 1) {! c" ?+ W3 B$ D- J6 G6 o( d9 |( }; ~; M
                //删除尾节点
    9 x# |4 L6 m* Z& \4 m) `            Node preNode = get(index - 1);" }9 c! [& P4 x: U
                removeNode = preNode.next;. n( t# F3 `5 n5 a# O$ x& t
                preNode.next = null;
    1 I6 N/ l* t0 o' {+ G5 a4 u            last = preNode;; n9 B/ \$ n+ E
            } else {
    ' q3 z, S7 `- x7 Z1 o. s6 J            //删除中间节点
    1 N+ ~& s5 [$ Z, O' X0 ?! T. l            Node prevNode = get(index - 1);
    $ Z9 S, ^4 B9 `% ~4 Q. R% I            removeNode = prevNode.next;# ?5 H6 y4 g9 o$ y& E
                prevNode.next = prevNode.next.next;
    8 u! w9 }" ^( J& X        }9 K. ?3 ^% J  z) H: ~1 H
            size--;  V0 }* A6 N# R0 i
            return removeNode;7 W( q3 @5 x$ [6 E
        }
    . G. ^1 u. Q1 n9 M, _4 Q$ z
    4 g: q; L9 d, U2 W    /**7 M, e1 R- F; a/ N3 r- a0 F
         * 更新节点 将列表中指定位置的节点的data替换为指定的data。! m. l/ a6 r! A' @
         *
    5 A$ S7 K& y( e6 {     * @param index 需要更新的节点的位置
    : }2 {5 m9 d  h, I4 H     * @param data  新data* s4 W% a9 ~$ I
         * @return 旧data
    4 A- d% g0 a7 N# ?5 E+ P7 j     */
    % L+ ^, y  I% w( W  T0 x    public int set(int index, int data) {; V" Z7 W: c4 M
            Node x = get(index);4 m+ L9 c! s" O! U; W( o
            int oldVal = x.data;
    $ x4 p/ j+ y$ }$ y% n        x.data = data;
    + j9 `" o2 g2 y! z) v        return oldVal;
    3 Q8 P. W: J- ^+ {- u: p  f) `    }
    - P3 B2 J* O5 [7 @& Q4 a: U, v: L, v% C# X6 A8 K% X/ @) {: A1 K
        /**
    2 Y" g1 J: _2 n     * 链表查找元素; _. o0 o6 h6 z) m/ J' r
         *$ U, W/ k+ U5 Y% W0 j4 K/ s
         * @param index 查找的位置9 J: P- x, c+ @( G
         * @return index位置的Node对象: }4 r3 m$ c4 S9 v( J3 v
         */9 w. s$ `% v* V' s6 _. L
        public Node get(int index) {
    # z$ u; E7 C- L1 D" @/ |        if (index < 0 || index > size) {
    " I) x! P: ^9 R/ k1 A            throw new IndexOutOfBoundsException("超出链表的节点的范围!");0 y' f: |5 [9 v
            }
    " b# y3 A1 t3 x: W5 p! g$ X; D        Node temp = head;9 v* n% L5 @: S( ^! `" }
            for (int i = 0; i < index; i++) {# g- Z" k1 o4 J( O$ B
                temp = temp.next;  `: d7 J- P4 }$ X9 H. N$ c) r
            }
    4 J6 U; z5 P2 Z8 A' s, T6 V; j) o6 `- V, S        return temp;8 A! w, r& H8 Y# r  A$ X
        }
    5 L  X( }! P; f3 w+ Q2 m! G' j! U, M0 o
        /**4 R0 o9 N. L, S; [% K% A0 I
         * 输出链表
    7 B+ W) S! \& ]! x5 P7 `. m3 G     */
    ' u( L) `0 F+ u! b    public void output() {8 M# W3 T1 v/ g, I
            Node temp = head;' s* [6 W5 T+ `, V" o; S0 v, c
            while (temp != null) {9 ~0 L: W; j: q( c- Q5 n% L+ A
                System.out.print(temp.data + " ");! g( `- a+ b5 J0 k
                temp = temp.next;8 g' x* O0 g9 `2 N4 D/ T
            }& R9 ^1 L/ P* n0 y
        }
    8 f6 _- T; g6 J- J7 Y) R, u7 ~" z5 R0 M
        /**+ X# [0 T" I5 Y6 X! K1 X
         * 链表节点
    ! E2 e+ `$ Y9 G; Y3 W1 \     *// J. C! w* `) |3 |6 w! |0 j
        class Node {
    , I$ S: z4 f6 u1 w; t        int data;
    + k+ o4 ]$ B7 U" E2 @        Node next;
    ( L$ q- R+ w- P% o" s6 O( \4 l8 R$ n5 K6 Y$ d: q
            Node(int data) {
    5 _& G, z6 l7 s" e6 s            this.data = data;
    % I! c2 Z' u; [- l        }  U! k3 i/ {" q) ^; O$ j1 E% i
        }
    * e' ]4 k0 |# f}
    3 S% y. q; A0 a/ L* D% s6 ]$ T" a' H6 M

    2 p7 o, P3 q# D二、双向链表 12.png
    1 h% h* _) W* N6 b" A双向链表比单向链表稍微复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev 指针。1 B& m( g- w# ~- I) O' b6 Q, u

    8 d* n( }( A' t# X+ g* N  E3 |( \$ Z. f9 i/ v% l+ L

    8 t) t7 K( D+ A( i5 p. _% ]& V5 T$ B' ?
    ————————————————" G4 \( K1 o0 E
    版权声明:本文为CSDN博主「爱做梦的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 _; I  O/ U! K, O; q原文链接:https://blog.csdn.net/weixin_43124279/article/details/1059044689 E1 @- |2 U) D  T8 l5 H# E5 F

    5 t, i) W2 n/ m- r# j* i0 x  v0 k+ I  E. W! P- n

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

    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-7-26 22:05 , Processed in 0.336315 second(s), 54 queries .

    回顶部