2014.06.14 21:40
简介:
单向链表应该是绝大多数C语言初学者学会的第一个结构体了。每个节点会指向后续节点,属于顺序结构。由于单链表的实现简单,并且有着明显的限制,使其成为各种天才面试官们虐小朋友的利器(链表的功能实在很有限,而面试官总是要求你用链表完成各种各样的任务,难度就在这儿了)。因此,随手写链表肯定是参加面试的底线了,否则你都没机会动笔就可以回家等消息了。
图示:
实现:
1 // My implementation for singly linked list. 2 struct ListNode { 3 int val; 4 ListNode *next; 5 ListNode(int _val = 0): val(_val), next(nullptr) {}; 6 }; 7 8 class SinglyLinkedList { 9 public: 10 SinglyLinkedList() { 11 m_size = 0; 12 m_head = nullptr; 13 m_tail = nullptr; 14 } 15 16 void insertFront(int val) { 17 if (m_size == 0) { 18 m_head = m_tail = new ListNode(val); 19 } else { 20 ListNode *ptr = new ListNode(val); 21 ptr->next = m_head; 22 m_head = ptr; 23 } 24 ++m_size; 25 } 26 27 void insertBack(int val) { 28 if (m_size == 0) { 29 m_head = m_tail = new ListNode(val); 30 } else { 31 m_tail->next = new ListNode(val); 32 m_tail = m_tail->next; 33 } 34 ++m_size; 35 } 36 37 void insertNode(int pos, int val) { 38 int i; 39 40 if (i <= 0) { 41 insertFront(val); 42 } else if (i >= m_size) { 43 insertBack(val); 44 } else { 45 ListNode *ptr1, *ptr2; 46 47 ptr1 = m_head; 48 for (i = 0; i < pos - 1; ++i) { 49 ptr1 = ptr1->next; 50 } 51 ptr2 = new ListNode(val); 52 ptr2->next = ptr1->next; 53 ptr1->next = ptr2; 54 ++m_size; 55 } 56 } 57 58 void deleteNode(int pos) { 59 if (pos < 0 || pos > m_size - 1) { 60 return; 61 } 62 63 ListNode *ptr1, *ptr2; 64 if (pos == 0) { 65 ptr1 = m_head; 66 if (m_size == 1) { 67 m_head = m_tail = nullptr; 68 } else { 69 m_head = m_head->next; 70 } 71 delete ptr1; 72 } else { 73 ptr1 = m_head; 74 for (int i = 0; i < pos - 1; ++i) { 75 ptr1 = ptr1->next; 76 } 77 ptr2 = ptr1->next; 78 ptr1->next = ptr2->next; 79 if (ptr2->next == nullptr) { 80 m_tail = ptr1; 81 } 82 delete ptr2; 83 } 84 --m_size; 85 } 86 87 void updateNode(int pos, int val) { 88 if (pos < 0 || pos > m_size - 1) { 89 return; 90 } 91 92 ListNode *ptr = m_head; 93 for (int i = 0; i < pos; ++i) { 94 ptr = ptr->next; 95 } 96 ptr->val = val; 97 } 98 99 ListNode *findNode(int val) { 100 ListNode *ptr = m_head; 101 while (ptr != nullptr) { 102 if (ptr->val == val) { 103 return ptr; 104 } 105 ptr = ptr->next; 106 } 107 108 return nullptr; 109 } 110 111 ~SinglyLinkedList() { 112 ListNode *ptr = m_head; 113 while (m_head != nullptr) { 114 m_head = m_head->next; 115 delete ptr; 116 ptr = m_head; 117 } 118 m_head = m_tail = nullptr; 119 } 120 private: 121 int m_size; 122 ListNode *m_head; 123 ListNode *m_tail; 124 }; 125 126 int main() 127 { 128 return 0; 129 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)