美文网首页
有序数组合并、尾部打印链表、反转链表、倒数第K个

有序数组合并、尾部打印链表、反转链表、倒数第K个

作者: 潇萧之炎 | 来源:发表于2019-08-29 17:28 被阅读0次
package com.example.java;

import java.util.ArrayList;
import java.util.Stack;

public class Sort {

    public static void main(String[] args) {
        int[] a = {1, 7, 9, 11, 13, 15, 17, 19};
        int[] b = {2, 4, 6, 7, 10};
        //调用printArray方法,并将merge方法的返回值传给printArray
        printArray(merge(a, b));
    }

    //1. 将两个有序数组合并为一个
    public static int[] merge(int[] a, int[] b) {

        int[] c = new int[a.length + b.length];
        //i用于标记数组a
        int i = 0;
        //j用于标记数组b
        int j = 0;
        //用于标记数组c
        int k = 0;

        //a,b数组都有元素时
        while (i < a.length && j < b.length) {
            if (a[i] < b[j]) {
                c[k++] = a[i++];
            } else {
                c[k++] = b[j++];
            }
        }

        //若a有剩余
        while (i < a.length) {
            c[k++] = a[i++];
        }

        //若b有剩余
        while (j < b.length) {
            c[k++] = b[j++];
        }

        return c;
    }

    //打印数组
    public static void printArray(int[] arr) {
        for (int i : arr) {
            System.out.print(i + "  ");
        }
    }


    //2.从链尾打印链表
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            if (null == listNode) {
                return list;
            }
            Stack<Integer> stack = new Stack<Integer>();
            while (listNode != null) {
                stack.push(listNode.val);
                listNode = listNode.next;
            }
            while (!stack.empty()) {
                list.add(stack.pop());
            }
            return list;
        }
    }

    //3.反转链表
    public ListNode ReverseList(ListNode head) {
        if (head == null)
            return null;
        //head为当前节点,如果当前节点为空的话,那就什么也不做,直接返回null;
        ListNode pre = null;
        ListNode next = null;
        //当前节点是head,pre为当前节点的前一节点,next为当前节点的下一节点
        //需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2
        //即pre让head节点可以反转所指方向,但反转之后如果不用next节点保存next1节点的话,此单链表就此断开了
        //所以需要用到pre和next两个节点
        //1->2->3->4->5
        //1<-2<-3 4->5
        while (head != null) {
            //做循环,如果当前节点不为空的话,始终执行此循环,此循环的目的就是让当前节点从指向next到指向pre
            //如此就可以做到反转链表的效果
            //先用next保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂
            next = head.next;
            //保存完next,就可以让head从指向next变成指向pre了,代码如下
            head.next = pre;
            //head指向pre后,就继续依次反转下一个节点
            //让pre,head,next依次向后移动一个节点,继续下一次的指针反转
            pre = head;
            head = next;
        }
        //如果head为null的时候,pre就为最后一个节点了,但是链表已经反转完毕,pre就是反转后链表的第一个节点
        //直接输出pre就是我们想要得到的反转后的链表
        return pre;
    }
}


   //4.链表倒数第k个节点
public ListNode FindKthToTail(ListNode head, int k) {
        ListNode pre = head;
        ListNode p = head;
        //记录k值
        int a = k;
        //记录节点的个数
        int count = 0;
        //p指针先跑,并且记录节点数,当p指针跑了k-1个节点后,pre指针开始跑,
        //当p指针跑到最后时,pre所指指针就是倒数第k个节点
        while (p != null) {
            p = p.next;
            count++;
            if (k < 1) {
                pre = pre.next;
            }
            k--;
        }
        //如果节点个数小于所求的倒数第k个节点,则返回空
        if (count < a) return null;
        return pre;
    }

相关文章

  • 基础算法

    LinkedList003-从尾到头打印链表014-链表中倒数第k个结点015-反转链表016-合并两个或k个有序...

  • 链表

    链表基本操作 从尾到头打印链表 删除链表的节点 链表中倒数第K个节点 反转链表 合并两个有序链表 两个链表的第一个...

  • 2018-07-26

    合并有顺序的数组 打印两个有序链表的公共部分 在单链表和双链表中删除倒数第k个节点 单链表 双链表 删除链表的中间...

  • 2022-02-23 链表专栏

    链表基础 类别 1、合并两个有序链表2、合并 k 个有序链表3、寻找单链表的倒数第 k 个节点4、寻找单链表的中点...

  • 有序数组合并、尾部打印链表、反转链表、倒数第K个

  • 算法 - 链表实现(OC) 及简单的链表算法

    链表实现 打印链表 链表反转 (使用递归法) 两个有序链表合并为一个有序链表 力扣题[https://leetco...

  • 常见算法总结

    链表 单链表反转链表中环的检测两个有序的链表合并删除链表倒数第 n 个结点求链表中间第n个节点

  • 2018-11-08 单向链表的一系列操作

    我们在这篇文章主要记录下链表的基本操作. 主要包括 反转链表 检测环 两个有序的链表合并 删除倒数第K个节点 求链...

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

  • 链表类算法题汇总

    算法题目中常考察的链表操作无非以下几种: 链表反转 链表合并 寻找链表中点 寻找链表倒数第 K 个节点 删除链表节...

网友评论

      本文标题:有序数组合并、尾部打印链表、反转链表、倒数第K个

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