从头开始学Java数据结构和算法的第一天,希望能坚持下去...
LinkedList--《Java核心技术》之集合
集合类库:将接口(interface)与实现(implementation)分离
注:①Collection集中不能有重复的对象
②Java集合类库和其他类库的迭代器存在重要区别:
C++中,迭代器根据数组索引建模,可直接使用索引查看数组元素;不需查找,就可以移动迭代器。
Java中,查找操作与位置变更紧密关联,查找一个元素的唯一方法是调用next;在进行查找元素时,迭代器随之向前移动。
可以认为Java的迭代器位于两个元素之间
③add方法只依赖于迭代器的位置,而remove方法依赖于迭代器的状态(调用next或previous)。
官网方法
https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html?is-external=true
程序清单9-1
import java.util.*;
public class LinkedListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> a=new LinkedList<>();
a.add("Amy");
a.add("Carl");
a.add("Erica");
List<String> b=new LinkedList<>();
b.add("Bob");
b.add("Doug");
b.add("Frances");
b.add("Gloria");
ListIterator<String> aIter=a.listIterator();
Iterator<String> bIter=b.iterator();
while(bIter.hasNext()) {
if(aIter.hasNext())
aIter.next();
aIter.add(bIter.next());
}
System.out.println(a);
bIter=b.iterator();
while(bIter.hasNext()) {
if(bIter.hasNext()) {
bIter.next();
bIter.remove();
}
}
System.out.println(b);
a.removeAll(b);//从a中删去b中所有元素
System.out.println(a);
}
}
LeetCode · LinkedList
-
876. Middle of the Linked List
class Solution {
public ListNode middleNode(ListNode head) {
//arr traverses the whole ListNode.
List<Integer> arr=new LinkedList<>();
arr.add(head.val);
ListNode tmp=head.next;
while(tmp!=null){
arr.add(tmp.val);
tmp=tmp.next;
}
//get size.
int LNnum=Math.round(arr.size()/2);
//return newArr.
ListNode newArr=head;
for(int i=0;i<LNnum;i++)
newArr=newArr.next;
return newArr;
}
}
算是对今天刚看的LinkedList活学活用,比较顺利
-
21. Merge Two Sorted Lists
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode l=new ListNode(0);
ListNode tmp=l;
if(l1==null) return l2;
if(l2==null) return l1;
while(l1!=null && l2!=null){
if(l1.val<=l2.val){
tmp.next=l1;
l1=l1.next;
}
else{
tmp.next=l2;
l2=l2.next;
}
tmp=tmp.next;
}
if(l1!=null){
tmp.next=l1;
}
else{
tmp.next=l2;
}
return l.next;
}
}
发现链表的使用忘差不多了,思路有点混乱;
好在整体上出入不大,细节也有考虑到。
-
206. Reverse Linked List
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev=head;
if(prev==null){//空
return null;
}
ListNode cur=prev.next;
if(cur==null){//单个元素
return prev;
}
ListNode next=cur.next;
prev.next=null;
if(next==null){//两个元素
cur.next=prev;
return cur;
}
while(next.next!=null){
cur.next=prev;
prev=cur;
cur=next;
next=next.next;
}
next.next=cur;
cur.next=prev;
head=next;
return head;
}
}
仍然比较混乱,要好好消化倒置等基本的链表操作;
考虑到了链表只有1/2个元素,却没有考虑到空链表的情况...
收获
1.Java中对列表元素默认为随机数
2.打印输出
System.out.println(arr);
3.定义整型的列表集合
List<Integer>
4.四舍五入
Math.round()
5.|,||
||和|都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断。
来自 <https://zhidao.baidu.com/question/95603837.html>
6.iterator,listIterator
同:都有hasNext()和next()方法,可以实现顺序向后遍历
都可删除对象
异:ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以
ListIterator有add()方法,可以向List中插入对象;Iterator不能
ListIterator可以通过set()方法实现对象的修改;Iterator仅能遍历,不能修改