美文网首页
链表笔记

链表笔记

作者: bridegg | 来源:发表于2018-12-17 17:40 被阅读0次

定义

节点的定义:

可以用任意一组储存单元来储存数据元素(储存单元可以是不联系的)
除了储存每个数据元素外,还必须储存指示其直接后续元素的信息
这两部分的信息租车的数据元素的储存印象为节点

链表:

多个节点在一块被称为链表

单链表:

当节点只包含其后继节点信息的链表为单链表

头结点:

链表的第一个节点为头结点

单链表中有头节点:

有头节点是指单链表中存在第一个节点,若链表为空,则指向空,若链表不为空则指向第一个元素节点的储存位置

单链表中无头节点:

无头节点是指单链表中不存在指向第一个元素节点储存位置的节点,若链表为空,则第一个节点为空

有头节点的作用:

1当链表的任何节点之前插入或删除节点时,都需要修改前一个节点的指向,因为单链表所有节点都有前驱节点。
若链表没有头结点,则元素节第一节点没有前驱节点,修改时操作复杂。
2对于空链表费空链表所有的头指针都不为空

举例

将单链表h-1-2-3-4-5-6-7 逆序 变为h-7-6-5-4-3-2-1
链表对象LNode

/**
 * 链表对象
 * 
 * @author xus
 *
 */
public class LNode {
    int data;//链表中存在的值
    LNode next;//链表中存在的指向,java中用引用
}


public class ReverseOrder {
    /*
     * 创建一个单链表,并逆序
     */

    public static void main(String[] args) {
        LNode head = new LNode();//创建一个链表对象
        head.next = null;//将链表头对象的指向先设为空
        LNode tmp = null;//临时链表节点指向,
        LNode cur = head;//真正的链表节点对象
        for (int i = 0; i < 8; i++) {//创建7个节点
            tmp = new LNode();
            tmp.data = i;//将临时的值设为i
            tmp.next = null;//先将零时节点指向指空
            cur.next = tmp;//将上一个节点的指向指为本次创建的节点
            cur = tmp;指定本次节点
        }
        System.out.println("逆序前");
        
        for(cur=head.next;cur!=null;cur=cur.next) {
            System.out.println(cur.data+"");
        }
        System.out.println("\n逆序后");
        Reverse(head);
        for(cur=head.next;cur!=null;cur=cur.next) {
            System.out.println(cur.data+"");
        }
    }
/**
*这里将有序链表逆序
*/
    public static void Reverse(LNode head) {
        if (head == null || head.next == null)//若传进来的头为空则退出
            return;

        LNode pre = null;//上一个节点
        LNode cur = null;//指向节点
        LNode next = null;//下一个节点
        cur = head.next;//先将当前节点指向头结点
        next = cur.next;//将下一个节点指向头结点的下一个节点
        cur.next = null;//当前节点指空
        pre = cur;//将上一个节点变成当前节点
        cur = next;//将当前节点变成下个节点
//遍历所有节点,让当前的下一个节点指向上一个节点
        while (cur.next!= null) {//如果当前节点没有指向节点,则说明该节点为最后一个节点
            next = cur.next;//下一个节点指向当前节点的下一个节点
            cur.next = pre;//将当前下一个指向节点指向上一个节点
            pre = cur;//让上一个节点变成当前节点
            cur = cur.next;//让per节点变成当前的下一个节点
            cur = next;//让当前节点变成下个节点继续循环
        }
        cur.next = pre;//让最后一个节点指向倒数第二个节点
        head.next = cur;//让链表头指向最后一个节点
    }
}

这种是对所有链表进行遍历,所以时间复杂度O(N),N=链表长度,而且对原链表进行了破坏

相关文章

网友评论

      本文标题:链表笔记

      本文链接:https://www.haomeiwen.com/subject/hqskkqtx.html