单链表的介绍

链表的介绍

  •  链表是有序的列表
  • 链表是以节点的方式来存储,是链式存储
  • 每个节点包含 data 域, next 域:指向下一个节点.
  • 链表的各个节点不一定是连续存储.
  • 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定

单链表介绍

单链表(带头结点) 逻辑结构示意图如下


单链表的常见面试题有如下:

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

getLength方法

//方法:获取到单链表的节点个数(如果是带头结点的链表,需要不统计头结点)

// head链表的头结点
// 返回的就是有效节点的个数
public static int getLength(HeroNode head) {
       if(head.next ==null) { //空链表
               return 0;
       }
       int length = 0;
       //定义一个辅助的变量,这里我们没有统计头结点
       HeroNode cur = head.next;
       while ( cur != null ) {
              length++;
              cur = cur.next;//遍历
       }
       return length;
   }

测试getLength方法

//测试一下 求单链表中有效节点的个数
System.out.println(getLength(singleLinkedList.getHead()));

 

  • 查找单链表中的倒数第k个结点 【新浪面试题】

findLastIndexNode方法

//查找单链表中的倒数第K个节点
//思路
//1.编写一个方法,接收head节点,同时接收一个index
//2.index 表示是倒数第index个节点
//3.先把链表从头到尾遍历,得到链表的总的长度 genLength
//4.得到size后,我们从链表的第一个开始遍历(size -index)个,就可以得到
//5.如果找到,则返回该节点,否则返回null
public static HeroNode findLastIndexNode( HeroNode head, int index) {
    //判断如果链表为空,返回null
    if(head.next == null) {
         return null;//没有找到
    }
    //第一个遍历得到链表的长度(节点个数)
    int size = getLength(head);
    //第二次遍历size -index 位置,就是我们倒数的第k个节点
    //先做一个index的校验
    if (index <=0 || index >size) {
          return null;
    }
    //定义给辅助变量,for 循环定位到倒数的index
    HeroNode cur = head.next;
    for(int i=0; i< size - index;i++) {
        cur = cur.next;
    }
    return cur;
}

测试findLastIndexNode方法

//测试一下看看是否得到了倒数K个节点
HeroNode res = findLastIndexNode(singleLinkedList.getHead(),1);
System.out.println("res=" + res);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常见的数据结构,它由多个节点组成。每个节点包含两个部分:数据域和指针域。数据域用于存储节点中的数据,指针域用于指向下一个节点的地址。通过指针,多个节点可以组成一个链表,形成一种线性结构。 下面是一个简单的单链表的代码实现: ```C++ #include <iostream> using namespace std; // 定义节点结构体 struct ListNode { int val; // 数据域 ListNode *next; // 指针域 ListNode(int x) : val(x), next(NULL) {} // 构造函数 }; // 定义链表类 class LinkedList { public: LinkedList() : head(NULL) {} // 构造函数 ~LinkedList(); // 析构函数 void insert(int val); // 插入节点 void remove(int val); // 删除节点 void print(); // 打印链表 private: ListNode *head; // 头指针 }; // 析构函数 LinkedList::~LinkedList() { ListNode *p = head; while (p != NULL) { ListNode *q = p->next; delete p; p = q; } } // 插入节点 void LinkedList::insert(int val) { ListNode *node = new ListNode(val); if (head == NULL) { head = node; } else { ListNode *p = head; while (p->next != NULL) { p = p->next; } p->next = node; } } // 删除节点 void LinkedList::remove(int val) { if (head == NULL) { return; } if (head->val == val) { ListNode *p = head; head = head->next; delete p; } else { ListNode *p = head; while (p->next != NULL && p->next->val != val) { p = p->next; } if (p->next != NULL) { ListNode *q = p->next; p->next = q->next; delete q; } } } // 打印链表 void LinkedList::print() { ListNode *p = head; while (p != NULL) { cout << p->val << " -> "; p = p->next; } cout << "NULL" << endl; } // 测试代码 int main() { LinkedList list; list.insert(1); list.insert(2); list.insert(3); list.print(); list.remove(2); list.print(); return 0; } ``` 在这个实现中,我们定义了一个 ListNode 结构体,其中包含了一个整数类型的数据域和一个指针类型的指针域。同时,我们定义了一个 LinkedList 类,用于实现单链表的基本操作。 在 insert 方法中,我们首先创建一个新的节点,然后遍历链表,找到最后一个节点,将新节点插入到链表的末尾。 在 remove 方法中,我们首先判断头节点是否是要删除的节点,如果是,直接删除头节点。否则,遍历链表,找到要删除的节点,将其从链表中移除。 最后,在 print 方法中,我们遍历链表,将每个节点的值打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值