java实现带头结点的单链表的插入、删除、求长度

前段时间知乎面试,面试官出了一道题目实现单链表的插入、删除、计算长度,当时勉强写出来了,但是不是用的面向对象的思路写的,面试官叫我改成面向对象的方式。当时突然想到AQS的底层实现方式,就想仿照改一下。结果面试官说时间原因,就不写了。。。。。

AQS里面有一个头结点head和一个尾节点tail,刚开始head和tail都是没有初始化的,后面第一个进入阻塞对的第一个节点会在enq方法中初始化head,AQS中阻塞队列是不算head节点,head节点可以理解为当前拥有锁的节点。想了解更多的可以去看看AQS和ReentrantLock的源码。

思想我们也可以借鉴AQS,实现一个带头结点的单链表(注意头结点是不算在链表中),具体的代码如下:

package cn.cqupt.linked;

class Node {
	int data;
	Node next;

	Node() {
	}

	Node(int data) {
		this.data = data;
		this.next = null;
	}
}

public class LinkedOp {
	// 头结点
	private  Node head;
	// 链表的长度
	private  int size;
	
	// 构造函数初始化头结点,也可以在插入第一个节点的时候初始化
	LinkedOp(){
		head = new Node();
	}
	// 头插法
	public void insertFromHead(int data){
		// 将data封装为Node节点
		Node node = new Node(data);
		// 如果链表为空,直接跟在head后面
		i
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个示例代码,实现头结点单链表插入排序: ```cpp #include <iostream> struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; void insertSort(ListNode* head) { if (head == nullptr || head->next == nullptr) { return; } ListNode* dummy = new ListNode(0); // 创建一个虚拟头结点 dummy->next = head; ListNode* cur = head->next; // 从第二个结点开始遍历 head->next = nullptr; // 将原链表拆分 while (cur != nullptr) { ListNode* pre = dummy; while (pre->next != nullptr && pre->next->val < cur->val) { pre = pre->next; } ListNode* temp = pre->next; // 保存下一个结点 pre->next = cur; // 插入当前结点 cur = cur->next; // cur指针移动到下一个结点 pre->next->next = temp; // 连接后续结点 } head = dummy->next; // 更新头结点 delete dummy; // 删除虚拟头结点 } void printList(ListNode* head) { ListNode* cur = head; while (cur != nullptr) { std::cout << cur->val << " "; cur = cur->next; } std::cout << std::endl; } int main() { ListNode* head = new ListNode(4); ListNode* node1 = new ListNode(2); ListNode* node2 = new ListNode(1); ListNode* node3 = new ListNode(3); head->next = node1; node1->next = node2; node2->next = node3; std::cout << "Before sorting: "; printList(head); insertSort(head); std::cout << "After sorting: "; printList(head); return 0; } ``` 这段代码中,我们首先创建了一个头结点单链表,并初始化了一些结点。然后,我们使用插入排序算法对链表进行排序,最后打印排序后的链表结果。 希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值