下面是关于链表结构的代码:
class ListNode{ List<ThreePoints> element; int flag; ListNode next; public ListNode(List<ThreePoints> ele,int f){ this(ele,null,f); } public ListNode(List<ThreePoints> ele,ListNode n,int f){ element = ele; next = n; flag =f; } } class LinkedList{ ListNode header; int size; public LinkedList(){ header = new ListNode(null,-1); size = 0; } public void insert(ListNode newnode){ ListNode temp = header; while(temp.next != null){ temp = temp.next; } temp.next = newnode; size++; }
|
我们对要插入的node初始化:
ListNode newnode = new ListNode(List list,12);
然后初始化链表LinkedList newlinkedlist = new LinkedList();
最后插入:newlinkedlist.insert(newnode);
这样没有问题。但是不是所有插入情况都没有问题。
比如,如果我们做链表拷贝动作。先从一个已知链表逐个读取ListNode,然后插入新的链表。
LinkedList newlinkedlist = new LinkedList();//新的链表空的
ListNode newnode = linkedlist.header;//要被拷贝的链表的头结点
while(newnode.next != null){ newnode = newnode.next; int oldflag = (int)(newnode.flag/10); if(oldflag == newflag){ //如果我们直接写成如下的就出错了
/**wrong**********/
// newlinkedlist.insert(newnode);
/**wrong****而是要写成如下******/ List<ThreePoints> list1 = newnode.element; int flag = newnode.flag; ListNode newnode2 = new ListNode(list1,flag); newlinkedlist.insert(newnode2); }
|
开始程序执行的时候,再插入一个newnode之后,就死机了。找好好久才发现问题所在:原来,每个newnode刚从oldList上面读取出来后,其next指向的仍然是oldList上面的某个界面,也就是newnode.next != null。这就错啦,因为我们要再插入下一个节点的时候,看insert方法,是判断当前节点的next为null的时候才插入的,现在不为空,所以就错了。解决方法,就是读取数据后,重新做一个ListNode的某个实例,这样它的next就被初始化为null。所以间的链表还是需要注意好多东西的,否则连自己的摸不着头脑了。共勉之~
阅读(8496) | 评论(0) | 转发(0) |