博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节...
阅读量:4541 次
发布时间:2019-06-08

本文共 2420 字,大约阅读时间需要 8 分钟。

【题目】
分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。
【要求】
如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。
【题解】
从头遍历链表,每移动一次,K--,直至移动到链表尾部,此时
k>0,说明k太大,链表不用删除
k==0,链表长度即是k, 删除头结点即可
k<0,再次重头遍历链表,每移动一次,k++,
当k==0时,此时结点为要删除结点的前结点,使其指向下一个结点即可
双向链表一样,只不过需要注意前结点就好

1 #include 
2 using namespace std; 3 4 struct SNode 5 { 6 int val; 7 SNode* next; 8 SNode(int a = 0) :val(a), next(nullptr) {} 9 }; 10 11 struct DNode 12 { 13 int val; 14 DNode* pre; 15 DNode* next; 16 DNode(int a = 0) :val(a), pre(nullptr), next(nullptr) {} 17 }; 18 19 template
20 void printList(T head) 21 { 22 T p = head->next; 23 while (p) 24 { 25 cout << p->val << "->"; 26 p = p->next; 27 } 28 cout << endl; 29 } 30 31 SNode* DeleteSList(SNode* head, int k) 32 { 33 SNode*p = head->next; 34 while (p) 35 { 36 --k; 37 p = p->next; 38 } 39 if (k > 0)//k大于链表的长度,不用删除 40 return head; 41 else if (k == 0)//k==链表的长度,删除头结点即可 42 return head->next; 43 p = head; 44 while (k != 0)//找到删除结点的前结点 45 { 46 ++k; 47 p = p->next; 48 } 49 p->next = p->next->next; 50 return head; 51 } 52 53 DNode* DeleteDList(DNode* head, int k) 54 { 55 DNode*p = head->next; 56 while (p) 57 { 58 --k; 59 p = p->next; 60 } 61 if (k > 0)//k大于链表的长度,不用删除 62 return head; 63 else if (k == 0)//k==链表的长度,删除头结点即可 64 return head->next; 65 p = head; 66 while (k != 0)//找到删除结点的前结点 67 { 68 ++k; 69 p = p->next; 70 } 71 p->next->next->pre = p; 72 p->next = p->next->next; 73 return head; 74 } 75 76 77 int main() 78 { 79 SNode* head1 = new SNode(); 80 DNode* head2 = new DNode(); 81 SNode* p1 = head1; 82 DNode* p2 = head2; 83 for (int i = 1; i < 10; ++i) 84 { 85 SNode* q1 = new SNode(i); 86 DNode* q2 = new DNode(i); 87 p1->next = q1; 88 p1 = q1; 89 p2->next = q2; 90 q2->pre = p2; 91 p2 = q2; 92 } 93 cout << "删除前:" << endl; 94 printList(head1); 95 printList(head2); 96 97 head1 = DeleteSList(head1, 4); 98 head2 = DeleteDList(head2, 4); 99 cout << "删除后:" << endl;100 printList(head1);101 printList(head2);102 103 return 0;104 }

 

转载于:https://www.cnblogs.com/zzw1024/p/11181163.html

你可能感兴趣的文章
MAC和PHY的区别 (转自http://www.cnblogs.com/feitian629/archive/2013/01/25/2876857.html)
查看>>
.net core部署到linux
查看>>
html10个特效(转载)
查看>>
#将相同值输出,取一个值
查看>>
记一次戴尔R730服务器安装centos7.3步骤
查看>>
决策树基础
查看>>
献给程序员之如何与陌生人交谈
查看>>
Python之登录接口
查看>>
【arc074E】RGB Sequence
查看>>
工作3年了才开始有自己的积累
查看>>
使用axios向后端传递数据,后端接收不到?
查看>>
List 去处自定义重复对象方法
查看>>
CoreData的使用-1
查看>>
阿里云安装samba
查看>>
jsonp跨域
查看>>
day1-xml语言
查看>>
有谁知道瑞星在windows登录界面图标按钮是如何放上去的吗
查看>>
Delphi高效的字符串处理
查看>>
消息中间件ActiveMQ、RabbitMQ、RocketMQ、ZeroMQ、Kafka如何选型?
查看>>
带宽的理解
查看>>