- 1、本文档共82页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.3.2 单链表上基本操作的实现 3. 删除操作remove(i)实现 删除带头结点单链表中的第i个结点,其中 0≤i≤n-1。 要求: 有序对 ai-1, ai 和 ai, ai+1 改变为ai-1, ai+1 ai-1 ai ai+1 ai-1 a. 查找待删除结点的前驱结点(即第i-1个结点) b.修改链指针,使待删结点从单链表中脱离出来 单链表上删除操作算法的基本步骤: p = head ; j = -1; while (p.getNext()!=null j i-1) { p = p.getNext(); ++j; } ai-1 ai ai+1 ai-1 p.setNext(p.getNext().getNext()) p 单链表上删除操作remove(i)的算法 public void remove(int i) throws Exception { } //算法2.6结束 Node p = head; int j = -1; while (p.getNext()!= null ji-1 ) { p = p.getNext(); ++j; } if (j i-1 || p.getNext() == null ) // i不合法 throw new Exception(“删除位置不合法); 时间复杂度:O(n) p.setNext(p.getNext().getNext()); 问:如果单链表不带头结点,应如何修改此算法?? 问:如果是删除带头结点的单链表中值为x的结点,应如何修改此算法?? 例如:remove(3),顺序表listElem如下: for (int j = i; j curLen - 1; j++) listElem[j] = listElem[ j + 1]; //前移 21 18 30 75 42 56 87 21 18 30 75 42 56 87 curLen-1 0 0 56 87 curLen-1 42 listElem a.[检测参数i是否合法] b.[插入之后的所有元素前移一个位置] c.[修正表长:表长减1] 2)算法步骤: for (int j = i; j curLen - 1; j++) listElem[j] = listElem[ j + 1]; 若i 0 || i curLen-1,删除位置不合法, 抛出异常; curLen--; 3)算法 public void remove(int i) throws Exception { } //算法2.2结束 if (i 0 || i curLen - 1) throw new Exception(删除位置不合法); for (int j = i; j curLen - 1; j++) //前移 listElem[j] = listElem[j + 1]; curLen--; //表长减1 4)算法的性能分析(考虑移动元素的平均情况) 在长度为n的顺序表上删除第i(0≤i≤n-1)个数据元素会引起n-i-1个数据元素向前移动一个存储位置。假设删除第i个元素的概率为 pi ,则在等概率的情况下,移动元素的平均次数为: 时间复杂度为:O(n) 3. 查找操作 indexOf( x )的实现(书中算法 2.3) 查找数据元素x在顺序表中是否存在,若存在则函数返回x初次出现的位置,否则返回-1。 1)操作要求: 例如:顺序表 curLen=7 maxSize x = 38 j j j j j j 0 1 2 3 0 7 50 j 可见,基本操作是:将顺序表中的元素逐个和给定值 x相比较。主要实现语句如下: 23 75 41 38 54 62 17 listElem … while (j curLen !listElem[j].equals(x)) j++; 2)算法 public int indexOf (Object x) { } //算法2.3结束 int j = 0; while (j curLen !listElem[j].equals(x)) j++; if (j curLen) return j; else
文档评论(0)