zoukankan      html  css  js  c++  java
  • 数据结构与算法-链表

    链表
    链表是面试时被提及最频繁的数据结构。链表就是通过指针将一个个节点连接起来。链表是非连续的动态内存空间,链表的查找比数组慢,但是添加和删除比数组快。
    链表声明

    1 public class ListNode {
    2     int val;
    3     ListNode next;
    4     public ListNode(int val) {
    5         this.val = val;
    6         this.next = null;
    7     }
    8 }            

    链表的添加

     1 public void insertList(ListNode head, int val) {
     2     ListNode tempNode = new ListNode(val);
     3     if (head == null) {
     4         head = tempNode;
     5     }else {
     6         ListNode p = head;
     7         while (p.next != null) {
     8             p = p.next;
     9         }
    10         p.next = tempNode;
    11     }
    12 }    

    链表的删除

     1 public void deleteListNode(ListNode head, int val) {
     2     if (head ==null) return;//为了鲁棒性
     3     if (head.val == val) {//头节点为要删除节点
     4         head = head.next;
     5     } else {
     6         ListNode p = head;
     7         //删除节点需要知道前一个节点,所以判断p.next.val是不是和目标相等
     8         while (p.next !=null && p.next.val != val) {
     9             p = p.next;
    10         }
    11         if (p.next !=null) {
    12             p.next = p.next.next;//删除节点
    13         }
    14     }
    15 }

    从尾到头打印链表
    方法1:使用栈结构

     1 public void printList1(ListNode head) {
     2     if (head == null) return;
     3     Stack<ListNode> stack = new Stack<ListNode>();
     4     ListNode p = head;
     5     while (p != null) {
     6         stack.push(p);
     7         p = p.next;
     8     }
     9     while (!stack.isEmpty()) {
    10         p = stack.pop();
    11         System.out.print(p.val+" ");
    12     }
    13 }

    方法2:递归

    1 public void printList2 (ListNode head) {
    2     if (head != null) {
    3         if (head.next != null) {
    4             printList2(head.next);
    5         }
    6         System.out.print(head.val+" ");
    7     }
    8 }

    注:递归的过程相当于栈。


    反转单链表

     1 public ListNode reverseList (ListNode head) {
     2     ListNode pre = null;
     3     ListNode next;
     4     while (head != null) {
     5         next = head.next;
     6         head.next = pre;
     7         pre = head;
     8         head = next;
     9     }
    10     return pre;
    11 }

    反转双链表

     1 public class DoubleNode {
     2     public int val;
     3     public DoubleNode pre;
     4     public DoubleNode next;
     5     public DoubleNode (int val){
     6         this.val=val;
     7     }
     8 }
     9 public Node reverseList(Node head){
    10     DoubleNode pre=null;
    11     DoubleNode next=null;
    12     while(head!=null){
    13         //反转第一个节点
    14         next=head.next;//记录下一个节点
    15         head.next=pre;//反转当前节点:next指针指向上一个节点
    16         head.pre=next;//反转当前节点:pre指针指向下一个节点
    17         pre=head;//记录当前节点为下一个节点的pre
    18         head=next;//移动到下一个节点
    19     }
    20     return pre;//返回新头节点
    21 }

    学习数据结构与算法的记录和整理,如有错误或意见请帮忙指出,以后会持续更新。。。。


    参考书籍:
    《程序员代码面试指南:IT名企算法与数据结构题目最优解》—左程云
    《剑指Offer》 —何海涛

     
  • 相关阅读:
    Python集合(set)类型的操作
    3GPP接口定义及相关协议一览
    OSS基本概念介绍
    建造者模式(Builder Pattern)
    组合模式(Composite Pattern)
    观察者模式(Observe Pattern)
    ReentrantLock
    <logger>和<root>
    logback的configuration
    logback的加载过程
  • 原文地址:https://www.cnblogs.com/hiyoung/p/9687502.html
Copyright © 2011-2022 走看看