链表常见操作

1.迭代。
链表最常见的操作就是迭代。

 while (head.next != null) {
            head = head.next;
        }

2.链表转化为数组
涉及到下标的问题,都可以将链表转化为数组解决,数组的每一个元素都是一个节点。。
示例题目,返回链表的中间节点

 public ListNode middleNode(ListNode head) {
        ListNode[] A = new ListNode[100];
        int t = 0;
        while (head.next != null) {
            A[t++] = head;
            head = head.next;
        }
        return A[t / 2];
    }

类似的,输出链表中倒数第k个结点。也可以采用转化为数组的思路。

3.删除链表的一个节点
将当前节点node的指针next指向下一个节点的下一个节点,就相当于删除下个节点了。

node.next=node.next.next;  

示例题目 :
一个有序的链表删除重复数据。

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head==null || head.next==null){
            return head;
        }
        ListNode node=head;
        while(node!=null && node.next!=null ){
            if( node.val==node.next.val ) {
           //删除重复的节点,不进行迭代,因为重复的值可能出现多次
                node.next=node.next.next;
            }else {
           //迭代
                node=node.next;
            }

        }
        return head;
    }
}

4.双指针操作
4.1快慢指针
使用两个指针,用不同的起点/速度去遍历。
示例题目:输入一个链表,输出该链表中倒数第k个结点。

public ListNode FindKthToTail(ListNode head,int k) { //5,{1,2,3,4,5}
       if(k<0 || head==null ) {
              return head;
         }
        ListNode p, q;
        p = q = head;
        int i = 0;
       //p指针先跑,并且记录节点数,当p指针跑了k-1个节点后,pre指针开始跑,
       //当p指针跑到最后时,pre所指指针就是倒数第k个节点
        for ( ; p != null; i++) {
            p = p.next;
            if (i >= k)
                q = q.next;
        }
        return i < k ? null : q;
    }

示例题目:判断一个链表,是否为环形链表。
思路:处理环形链表时,也可以使用快慢指针,一个走得快,一个走得慢,如果是环形链表,那么这两个指针最终会相遇。

public boolean hasCycle(ListNode head) {
  ListNode slow = head, fast = head;

  while (fast != null && fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;

    if (slow == fast)
        return true;
  }

  return false;
}

4.2前后节点指针
上一个节点prev,当前节点curr。
示例:链表删除指定的数据

 /* Example:
 * Input:  1->2->6->3->4->5->6, val = 6
 * Output: 1->2->3->4->5
 */
public class LeetCode203 {
        public ListNode removeElements(ListNode head, int val) {
            //通过fakeHead.next记住链表,以便返回结果
            ListNode fakeHead = new ListNode(-1);
            fakeHead.next = head;
            //curr是当前节点,prev是上一个节点。
            ListNode curr = head, prev = fakeHead;
            while (curr != null) {
                if (curr.val == val) {
                    prev.next = curr.next;
                } else {
                    prev = prev.next;
                }
                curr = curr.next;
            }
            return fakeHead.next;
        }
}

4.新建链表解决问题,或者在原来的链表上解决。
5.反转链表。
(1)就地反转。(2)新建链表反转。
(3)可以通过栈实现,将链表数据放入栈里面,再拿出来。也就是通过Stack,push()进去,再pop()出来。
(4)通过递归解决。
6.链表删除指定位置的数据。
7.组装两个有序链表。.
类似于小学时,老师将两支小分队按从矮到高排成一队。

class LeetCode21 {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null ) {
            return l2;
        }
        if(l2==null) {
            return l1;
        }
        //头节点node
        ListNode node=new ListNode(0);
        ListNode resultNode=node;
        //将数据小的节点插入到新的节点中。
        while(l1!=null && l2!=null){
            if(l1.val<l2.val ) {
                resultNode.next=l1;
                l1=l1.next;
            }else {
                resultNode.next=l2;
                l2=l2.next;
            }
             resultNode=resultNode.next;
        }
        if(l1==null) {
            resultNode.next=l2;
        }
        if(l2==null) {
            resultNode.next=l1;
        }
        return node.next;
    }
}

原文地址:https://www.cnblogs.com/expiator/p/10803779.html

时间: 2024-11-06 23:28:10

链表常见操作的相关文章

java数据结构:单链表常见操作代码实现

一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashMap等集合的底层结构都是链表结构.链表以结点作为存储单元,这些存储单元可以是不连续的.每个结点由两部分组成:存储的数值+前序结点和后序结点的指针.即有前序结点的指针又有后序结点的指针的链表称为双向链表,只包含后续指针的链表为单链表,本文总结的均为单链表的操作. 单链表结构: Java中单链表采用No

Java链表常见操作【剑指Offer】03:从尾到头打印链表

题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 题解一:递归 1 /* 2 在最后一次递归方法返回以后,每一层的递归方法都会做一个arrayList.add(listNode.val)这个操作, 3 从最后一次到第一次,逆向的调用了后面的方法 4 */ 5 static ArrayList<Integer> list = new ArrayList<>(); 6 public static ArrayList<Integer> printLis

动态单链表的传统存储方式和10种常见操作-C语言实现

顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. 一般链表的存储方法 一组物理位置任意的存储单元来存放线性表的数据元素,当然物理位置可以连续,也可以不连续,或者离散的分配到内存中的任意位置上都是可以的.故链表的逻辑顺序和物理顺序不一定一样. 因为,链表的逻辑关系和物理关系没有必然联系,那么表示数据元素之间的逻辑映象就要使用指针,每一个存储数据元素

链表的常见操作(转)

链表的常见操作 链表是数据结构的重要内容,在计算机程序中应用广泛,同时也是各公司笔试题目的重点. 以下简单实现了链表的一些操作,包括创建.增加节点.删除节点.单链表逆置.合并有序链表等. 一.链表创建 链表主要有三种形式,包括单链表.双链表和循环链表. 单链表每个节点只包含一个后驱指针,双链表节点同时包含一个前驱指针和一个后驱指针,循环链表的尾节点的后驱指向头节点. 代码如下: /*单链表节点结构*/typedef struct NodeType{char elem; NodeType *nex

链表常见题型(java版)

直接上干货..... 链表常见题型: 找到单链表的倒数第k个节点. 删除单链表中的某个结点(O(1)). 反转链表. 两个链表的第一个公共结点. 有环链表返回环路的开头节点(及判断是否有环). 合并两个排序的链表. 删除链表中重复的结点. 先给出链表的定义: /** * 单链表定义 */ public static class Node<E>{ private E element;//节点保存的元素 private Node<E> next;//指向下一个节点的引用 public

链表常见的题型(java实现)

链表是面试中最常见的一种题型,因为他的每个题的代码短,短短的几行代码就可以体现出应聘者的编码能力,所以它也就成为了面试的重点. 链表常见的操作有1.打印链表的公共部分,2.删除链表的倒数第K个节点,3.翻转单向链表,4.环形约瑟夫环问题,5.判断链表是否是一个回文链表,6.两个链表生成相加链表,7.删除无序链表中重复出现的节点,8.删除指定值得节点,9.合并两个有序的单链表,10.环形链表的插入 import java.util.*; /********** *@Author:Tom-shush

C#路径/文件/目录/I/O常见操作汇总

文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供给你一点有益的思路,如果你有好的建议,恳请能够留言,使这些内容更加完善. 主要内容:一.路径的相关操作, 如判断路径是否合法,路径类型,路径的特定部分,合并路径,系统文件夹路径等内容:二.相关通用文件对话框,这些对话框可以帮助我们操作文件系统中的文件和目录:三.文件.目录.驱动器的操作,如获取它们的

【代码学习】MYSQL数据库的常见操作

============================== MYSQL数据库的常见操作 ============================== 一.mysql的连接与关闭 -h:指定所连接的服务器位置 -u:数据库的用户名 -p:数据库的密码 1 mysql -u 用户名 -p //连接数据库 2 密码 3 exit //关闭数据库 1 mysql_connect($host,$user,$password); //连接数据库 2 mysql_close() //关闭数据库 二.创建数据

杂【第一天】包括eclipse常见操作,程序调试模式

观看传智播客视频笔记,感谢 eclipse的常见操作: 1.当即热版本低于编译器版本是,会出现bad Vresion number in class file的错误: 2.快捷键: alt+/:模板键 ctrl+1:快速修复 ctrl+shift+o:导包 设置代码阿保存的时候自动格式化:windows->首选项->Java->Editor->save Actions 代码移动:alt+上下键 重置视图:window->reset perspective... 3.典型的字节