- 浏览: 897171 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
10.两个单链表相交,计算相交点
分别遍历两个单链表,计算出它们的长度M和N,假设M比N大,则长度M的链表先前进M-N,然后两个链表同时以步长1前进,前进的同时比较当前的元素,如果相同,则必是交点。
public static Link GetIntersect(Link head1, Link head2) { Link curr1 = head1; Link curr2 = head2; int M = 0, N = 0; //goto the end of the link1 while (curr1.Next != null) { curr1 = curr1.Next; M++; } //goto the end of the link2 while (curr2.Next != null) { curr2 = curr2.Next; N++; } //return to the begining of the link curr1 = head1; curr2 = head2; if (M > N) { for (int i = 0; i < M - N; i++) curr1 = curr1.Next; } else if (M < N) { for (int i = 0; i < N - M; i++) curr2 = curr2.Next; } while (curr1.Next != null) { if (curr1 == curr2) { return curr1; } curr1 = curr1.Next; curr2 = curr2.Next; } return null; }
11.用链表模拟大整数加法运算
例如:9>9>9>NULL + 1>NULL => 1>0>0>0>NULL
肯定是使用递归啦,不然没办法解决进位+1问题,因为这时候要让前面的节点加1,而我们的单链表是永远指向前的。
此外对于999+1=1000,新得到的值的位数(4位)比原来的两个值(1个1位,1个3位)都多,所以我们将表头的值设置为0,如果多出一位来,就暂时存放到表头。递归结束后,如果表头为1,就在新的链表外再加一个新的表头。
//head1 length > head2, so M > N public static int Add(Link head1, Link head2, ref Link newHead, int M, int N) { // goto the end if (head1 == null) return 0; int temp = 0; int result = 0; newHead = new Link(null, 0); if (M > N) { result = Add(head1.Next, head2, ref newHead.Next, M - 1, N); temp = head1.Data + result; newHead.Data = temp % 10; return temp >= 10 ? 1 : 0; } else // M == N { result = Add(head1.Next, head2.Next, ref newHead.Next, M - 1, N - 1); temp = head1.Data + head2.Data + +result; newHead.Data = temp % 10; return temp >= 10 ? 1 : 0; } }
这里假设head1比head2长,而且M、N分别是head1和head2的长度。
12.单链表排序
无外乎是冒泡、选择、插入等排序方法。关键是交换算法,需要额外考虑。第7题我编写了一个交换算法,在本题的排序过程中,我们可以在外层和内层循环里面,捕捉到pre1和pre2,然后进行交换,而无需每次交换又要遍历一次单链表。
在实践中,我发现冒泡排序和选择排序都要求内层循环从链表的末尾向前走,这明显是不合时宜的。
所以我最终选择了插入排序算法,如下所示:
先给出基于数组的算法:
{
for (int i = 1; i < arr.Length; i++)
{
for (int j = i; (j > 0) && arr[j] < arr[j - 1]; j--)
{
arr[j] = arr[j] ^ arr[j - 1];
arr[j - 1] = arr[j] ^ arr[j - 1];
arr[j] = arr[j] ^ arr[j - 1];
}
}
return arr;
}
仿照上面的思想,我们来编写基于Link的算法:
public static Link SortLink(Link head) { Link pre1 = head; Link pre2 = head.Next; Link min = null; for (Link curr1 = head.Next; curr1 != null; curr1 = min.Next) { if (curr1.Next == null) break; min = curr1; for (Link curr2 = curr1.Next; curr2 != null; curr2 = curr2.Next) { //swap curr1 and curr2 if (curr2.Data < curr1.Data) { min = curr2; curr2 = curr1; curr1 = min; pre1.Next = curr1; curr2.Next = curr1.Next; curr1.Next = pre2; //if exchange element n-1 and n, no need to add reference from pre2 to curr2, because they are the same one if (pre2 != curr2) pre2.Next = curr2; } pre2 = curr2; } pre1 = min; pre2 = min.Next; } return head; }
值得注意的是,很多人的算法不能交换相邻两个元素,这是因为pre2和curr2是相等的,如果此时还执行pre2.Next = curr2; 会造成一个自己引用自己的环。
交换指针很是麻烦,而且效率也不高,需要经常排序的东西最好不要用链表来实现,还是数组好一些。
13.删除单链表中重复的元素
用Hashtable辅助,遍历一遍单链表就能搞定。
实践中发现,curr从表头开始,每次判断下一个元素curr.Netx是否重复,如果重复直接使用curr.Next = curr.Next.Next; 就可以删除重复元素——这是最好的算法。唯一的例外就是表尾,所以到达表尾,就break跳出while循环。
public static Link DeleteDuplexElements(Link head) { Hashtable ht = new Hashtable(); Link curr = head; while (curr != null) { if (curr.Next == null) { break; } if (ht[curr.Next.Data] != null) { curr.Next = curr.Next.Next; } else { ht[curr.Next.Data] = ""; } curr = curr.Next; } return head; }
结语:
单链表只有一个向前指针Next,所以要使用1-2个额外变量来存储当前元素的前一个或后一个指针。
尽量用while循环而不要用for循环,来进行遍历。
哇塞,我就是不用指针,照样能“修改地址”,达到和C++同样的效果,虽然很烦~
遍历的时候,不要在while循环中head=head.Next;这样会改变原先的数据结构。我们要这么写:Link curr=head;然后curr=curr.Next;
有时我们需要临时把环切开,有时我们需要临时把单链表首尾相连成一个环。
究竟是玩curr还是curr.Next,根据不同题目而各有用武之地,没有定论,不必强求。
发表评论
-
不使用/,%,+和*,如何判断一个数能否被3整除
2012-05-30 14:28 1750如果n的二进制末位为0,那么n和n>>1同时被 ... -
一些数学知识
2012-03-31 20:12 818zz:http://hi.baidu.com/imak ... -
高阶幂的求余的方法
2012-03-31 16:41 2729通常会有如下问法: 有两个数,A和B,A的范围 ... -
从N个变量中找出一个错误变量的方法
2012-03-31 12:17 832假设有N包咖啡,里面有一包咖啡是掺和了沙子的,可以将咖啡放到水 ... -
【转】大数据量算法
2012-03-06 16:11 1222第一部分、十五道海量数据处理面试题 1. 给定a、b两个 ... -
链表的一些常见笔试面试问题总结及代码
2010-10-27 13:39 1067先什么也不说,假设链 ... -
Trie Tree
2010-10-26 11:34 1450给你100000个长 ... -
字典树(trie tree)
2010-10-26 11:19 1361今天AC了两题tri ... -
高度为n的平衡二叉树最少需要多少个节点
2010-10-24 13:42 9371递推关系 A(1)=1 A(2)=2 A ... -
如何判断两个单向链表是否有相交,并找出交点
2010-10-24 13:37 1679题比较简单,单向链表有交点意思就是交点后的节点都是 ... -
大数据排序或取重或去重相关问题解决方案
2010-10-21 16:13 2752Q:TC群里有人发消息说在10亿个数据中找出所有的重复数,内存 ... -
分配排序(桶排序..)
2010-10-21 13:39 1851分配排序的基本思想:排序过程无须比较关键字,而是通过&qu ... -
Rete(3)
2010-10-21 09:59 9564.6 连接节点(Join node) ... -
Rete(2)
2010-10-21 09:57 1132使用RETE算法的模块系统 ... -
Rete(1)
2010-10-21 09:53 1029一、 rete概述Rete算法是一种前向规则快速匹配算法,其匹 ... -
[转]海量数据处理面试题
2010-10-20 15:15 10021. 给定a、b两个文件,各存放50亿个url,每个url各占 ... -
用JDBC实现数据的分页
2010-10-20 11:23 1199数据分页主要用到了resultSet的absolute()方法 ... -
如何求N的阶乘所得的数字末尾含有多少个0
2010-10-19 13:13 2145原题是这样: 给定 ... -
数据库笔试题(经典SELECT语句用法)
2010-10-18 22:49 2086问题描述: 为管理岗位业务培训信息,建立3个表: S ... -
Java分页实现
2010-10-18 22:11 1478Java代码 public interf ...
相关推荐
代码中包含单链表的常用操作,主要实现以下六个算法: 1.单链表的就地反转 2.链表相交或求公共起始节点 3.求链表倒数第n个节点 4.删除单个节点 5.判断链表是否有环 6.将2个递增的链表合并为递减链表 并全部调试通过...
链表操作举例,部分源代码 #include #include using namespace std; #define elemtype int typedef struct lnode { elemtype data; struct lnode *next; }lnode,*linklist;...}//end of create_list
数据结构和算法应用分解单链表.cpp
对以单链表为存储结构的表实现就地逆置,即在原有空间上实现逆置,不开辟新空间
以单链表为存储结构实现简单选择排序的算法
java单链表操作,封装性高,方便查看,考试、学习都可使用
写一个算法将一单链表逆置。要求操作在原链表上进行。
使用C++实现单链表的基本操作: 1、创建单链表 2、遍历单链表 3、单链表插入 4、删除单链表 5、判断是否为空 6、单链表的长度 7、单链表查找 8、退出
用flash方式演示各种数据结构基础算法2——单链表部分,很直观,合适基础学习者使用。里面包括:单链表结点的插入.swf,单链表结点的删除.swf,头插法建单链表.swf,尾插法建表.swf。
单链表的基本算法,包括单链表的初始化,单链表建立(头插法、尾插法),插入,删除、求表长、定位、查找多项式加法。
单链表面试常考算法总结及代码 单链表面试常考算法总结及代码 单链表面试常考算法总结及代码
非常齐全的单链表和二叉树算法大全,全都是在历年笔试时最容易考察的经典知识点。
该文件包含了C语言下的单链表的算法实现。
通过复习题 对单链表 在进行...1.设计将单链表L2连接在单链表L1后面的算法; 2.设计无头结点的单链表的删除算法; 3.设计无头结点的单链表的插入算法; 5.设计无头结点的单链表的逆置算法; 6.设计单链表的逆置算法;
【数据结构作业二】写出单链表结点的结构体类型定义及查找、插入、删除算法,并以单链表作存储结。。。 定义线性表节点的结构.pdf
1、利用尾插法创建一个类型为字符型的带头结点的单链表。 2、删除上述单链表中指定位置的元素。 3、要求:屏幕上分别显示删除前、后的单链表中元素列表;从键盘输入指定的删除位置。
void menu1(); //创建单链表 void menu2(); //读取指定位置元素 void menu3(); //在指定位置前插入新元素 void menu4(); //删除指定位置元素 void menu5(); //输入元素值查找第一个等于给定值的元素 void...
2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现 二、实现内容 1、单链表基本操作的实现 在带头结点的单链表h中第i个数据元素之前插入一个数据元素x ,首先需要在单链表中寻找到第i-1个结点...
数据结构-基本算法-单链表(学生时代源码,调试可运行)
(1) 初始化单链表; (2) 依次采用尾插入法插入a,b,c,d,e元素; (3) 输出单链表L; (4) 输出单链表L的长度; (5) 判断单链表L是否为空; (6) 输出单链表L的第三个元素; (7) 输出元素a的位置; (8) ...