数据结构之链表(单链表题目)

1.求单链表中有效节点的个数

/*
求单链表中有效节点的个数
 */
private static int getEffectiveNodeNum(SingleLinkedList.Node head) {
    SingleLinkedList.Node temp = head;
    //判断链表是否为空
    if (temp.next == null) {
        return 0;
    }
    int count = 0;
    while (temp.getNext() != null) {
        count++;
        temp = temp.getNext();
    }
    System.out.printf("当前链表的节点数量是 %d  如下", count);
    return count;
}

 

2 .查找单链表中的倒数第 k 个结点

 /*
查找单链表中的倒数第 k 个结点
 */
 private static SingleLinkedList.Node getNodeByNo(SingleLinkedList.Node head, int index) {
     SingleLinkedList.Node temp = head;
     //判断链表是否为空
     if (temp.next == null) {
         System.out.println("当前节点为空");
         return null;
     }
     int count = getEffectiveNodeNum(head);

     int position = count - index;
     for (int i = 0; i <= position; i++) {
         temp = temp.getNext();
     }
     //返回链表
     return temp;
 }

3.单链表的反转

 

/*
单链表的反转
 */
private static void reverse(SingleLinkedList.Node head) {
    //辅助指针
    SingleLinkedList.Node temp = head.next;
    if (temp == null) {
        System.out.println("链表为空");
        return;
    }
    if (temp.next == null) {
        System.out.println("当前链表只有一个节点");
        return;
    }
    //定义新的头节点
    SingleLinkedList.Node newHead = new SingleLinkedList.Node("", "", null);
    //当前节点的下一个节点,用于暂存,因为当前节点指针变化,保存下一个节点的位置
    SingleLinkedList.Node next = null;
    while (temp != null) {
        //暂存当前节点
        next = temp.next;
        //当前节点的下一个指针指向新节点的头节点的下一个,首节点的话,此处为空
        temp.next = newHead.next;
        //新节点的头节点的下一个节点指向当前节点
        newHead.next = temp;
        //当前节点指向暂存的节点
        temp = next;

    }
    //最后,将原头节点的next指向新节点的next
    head.next = newHead.next;

}

4.从尾到头打印单链表

/**
 * 从尾到头打印单链表
 * 方式1:反向遍历
 * 方式 2:Stack 栈
 *
 * @param head
 */
private static void reverseNodeOut(SingleLinkedList.Node head) {
    //使用栈FILO 先进后出的特性实现

    SingleLinkedList.Node temp = head.next;
    if (temp == null) {
        System.out.println("当前链表为空");
    }

    final Stack<SingleLinkedList.Node> stack = new Stack<>();

    while (temp != null) {
        stack.push(temp);
        temp = temp.next;
    }

    while (stack.size() > 0) {
        System.out.println(stack.pop());
    }

}

5.合并两个有序的单链表,合并之后的链表依然有序

/*
合并两个有序的单链表,合并之后的链表依然有序
 */
private static void mergeLinkedList(SingleLinkedList first, SingleLinkedList second) {

    final SingleLinkedList.Node firstHead = first.getHead();

    final SingleLinkedList.Node secondHead = second.getHead();

    if (firstHead.next == null && secondHead.next == null) {
        return;
    }

    //定义链表1 的辅助节点
    SingleLinkedList.Node firstTemp = firstHead.next;
    //定义链表2的辅助节点
    SingleLinkedList.Node secondTemp = secondHead.next;

    //定义新链表的头节点
    SingleLinkedList.Node newHead = new SingleLinkedList.Node("", "", null);
    //定义新链表的辅助节点
    SingleLinkedList.Node temp = newHead;

    //比较两个节点的no大小,进行节点的加入在新链表中
    while (firstTemp != null && secondTemp != null) {
        if (firstTemp.no < secondTemp.no) {
            //当前节点的next 指向 遍历到的节点
            temp.next = firstTemp;
            //temp后移一位
            temp = firstTemp;
            //当前节点的链表后移一位
            firstTemp = firstTemp.next;
        } else {
            //当前节点的next 指向 遍历到的节点
            temp.next = secondTemp;
            //temp后移一位
            temp = secondTemp;
            //当前节点的链表后移一位
            secondTemp = secondTemp.next;
        }
    }

    //第一个链表还剩余元素
    while (firstTemp != null) {
        temp.next = firstTemp;
        temp = firstTemp;
        firstTemp = firstTemp.next;
    }

    //第二个链表还剩余元素
    while (secondTemp != null) {
        temp.next = secondTemp;
        temp = secondTemp;
        secondTemp = secondTemp.next;
    }

    System.out.println("");
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值