Java链表操作代码

/**
 * 
 */
package com.cherish.SwordRefersToOffer;

/**
 * @author acer
 *
 */
public class test_22链表中倒数第k个节点 {

    /**
     * 
     */
    public test_22链表中倒数第k个节点() {
        // TODO 自动生成的构造函数存根
    }
    
    public static class ListNode{
        private    int val;
        ListNode next = null;
        ListNode(int val){
            this.val = val;
            next = null;
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        ListNode head = new ListNode(1);
        //给一个链表赋值
        for(int i = 2;i<10;i++) {
            insertNodeFromTail(head,new ListNode(i));
        }
        printListNode(head);
        System.out.println(FindKthToTail(head,4).val);
        System.out.println(listNodeLength(head));
        System.out.println(deleteFromIndex(head,4));
        printListNode(head);
        System.out.println(listNodeLength(head));
        System.out.println(FindKthToTail(head,4).val);
        

    }
    
    //找到倒数第k个节点
    public static ListNode FindKthToTail(ListNode head,int k) {
        if(head == null||k <= 0) {
            return null;
        }
        ListNode p1 = head;
        ListNode p2 = head;
        for(int i = 1;i<k;i++) {
            if(p1.next != null) {
                p1 = p1.next;
            }else {
                return null;
            }            
        }
        while(p1.next != null) {
            p1 = p1.next;
            p2 = p2.next;
        }
        return p2;
    }
    
    //从头部插入新节点
    public static void insertNodeFromHead(ListNode head,ListNode newNode)
    {
        newNode.next = head;
        head = newNode;
    }
    
    //从尾部插入新节点
    public static void insertNodeFromTail(ListNode head,ListNode newNode)
    {
        if(head == null) {
            head = newNode;
            return;
        }
        ListNode temp = head;//用temp代替head去遍历找到最后一个节点,一定不要用head自己去遍历,不然就找不到链表头了
        while(temp.next != null) { //下一节点不为空
            temp = temp.next;
        }
        temp.next = newNode;//找到最后一个节点后把新节点插入进去
    }
    
    //计算链表的长度
    public static int listNodeLength(ListNode head) {
        if(head ==null) {
            return 0;
        }
        ListNode temp = head;
        int length = 0;
        while(temp.next != null) {
            length++;
            temp = temp.next;            
        }
        return length;
    }
    
    //从特定位置删除链表
    public static boolean deleteFromIndex(ListNode head,int deleteIndex)
    {
        if(head == null || deleteIndex<1) {
            return false;
        }
        if(deleteIndex == 1) {
            head = head.next;
            return true;
        }
        int index = 1;
        ListNode temp = head;
        ListNode deleteNode;
        while(temp.next != null && index < deleteIndex) {
            index++;
            temp = temp.next;
        }
        deleteNode = temp.next;
        temp.next = deleteNode.next;
        return true;
    }
    
    //按顺序输出链表
    public static void printListNode(ListNode head)
    {
        ListNode temp = head;
        while(temp.next != null)
        {
            System.out.print(temp.val);
            System.out.print("\t");
            temp = temp.next;
        }
        System.out.println();
    }
    

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • json.stringfy()和json.parse()

    json.stringfy()将对象、数组转换成字符串;json.parse()将字符串转成json对象。

    CherishTheYouth
  • Java基础笔记之String相关知识

    我的理解:比如说 String myName = "Cherish";这个Cherish字符串一旦被创建,就会存到内存上某个地址如 0x58 处,然后这个字...

    CherishTheYouth
  • ES6学习笔记(二)

    设有默认值的参数,必须放在最后一个参数的位置,如:func(x,y,z = 5);

    CherishTheYouth
  • 链表倒数第n个节点

    一份执着✘
  • 力扣148——排序链表

    原题url:https://leetcode-cn.com/problems/sort-list/

    健程之道
  • LintCode 重排链表题目分析代码

    样例 给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null。

    desperate633
  • leetcode之-题19

    题目 [图片] Given a linked list, remove the nth node from the end of list and re...

    GavinZhou
  • 【Leet Code】19. Remove Nth Node From End of List

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • 学习Java Collection Framework的Iterator实现

    继续研读JDK的源码,在比较HashMap和ConcurrentHashMap的不同之处发现了一个细节——关于Iterator的实现的不同,其实HashMap和...

    用户3579639
  • failure load of Component-preload.js will NOT prevent application loading

    Suppose your application could not be opened when tile is clicked in launchpad, ...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券