LinkedList基本操作
LinkedList是Java中的一个双向链表实现,它提供了对链表的基本操作。在LinkedList中,每个元素都被包装在一个节点中,并且每个节点都包含指向前一个节点和后一个节点的引用。这种结构使得在LinkedList中插入、删除和访问元素的操作具有高效性能。
链表结构: LinkedList的底层数据结构是一个双向链表,每个节点包含三个属性:元素值、前驱节点的引用(prev)和后继节点的引用(next)。通过这种方式,可以在链表中轻松地在任意位置插入、删除元素。
自动扩容机制: LinkedList不需要进行自动扩容,因为它不具有固定容量的限制。每当需要插入一个新的元素时,LinkedList会在内存中创建一个新的节点,并更新前后节点的引用关系。这使得LinkedList的大小可以根据需要动态地增长或缩小。
创建LinkedList
要创建一个空的LinkedList,可以使用无参构造函数:
LinkedList<String> linkedList = new LinkedList<>();
要创建一个包含初始元素的LinkedList,可以使用带有Collection参数的构造函数:
List<String> initialElements = Arrays.asList("A", "B", "C");
LinkedList<String> linkedList = new LinkedList<>(initialElements);
添加元素
在链表末尾添加元素
可以使用add()
方法将元素添加到链表的末尾:
linkedList.add("D");
在指定位置插入元素
可以使用add(index, element)
方法在链表的指定位置插入元素:
linkedList.add(2, "X");
获取元素
获取指定位置的元素
可以使用get(index)
方法获取链表中指定位置的元素:
String element = linkedList.get(2);
获取链表的头结点和尾节点
可以使用getFirst()
和getLast()
方法获取链表的头结点和尾节点:
String firstElement = linkedList.getFirst();
String lastElement = linkedList.getLast();
删除元素
删除指定位置的元素
可以使用remove(index)
方法删除链表中指定位置的元素:
linkedList.remove(2);
删除指定元素
可以使用remove(element)
方法删除链表中指定的元素:
linkedList.remove("X");
删除头结点和尾节点
可以使用removeFirst()
和removeLast()
方法分别删除链表的头结点和尾节点:
String removedFirstElement = linkedList.removeFirst();
String removedLastElement = linkedList.removeLast();
修改元素
修改指定位置的元素
可以使用set(index, element)
方法修改链表中指定位置的元素:
linkedList.set(2, "Y");
遍历链表
可以使用增强型for
循环或迭代器来遍历链表中的所有元素:
// 使用增强型for循环
for (String element : linkedList) {
System.out.println(element);
}
// 使用迭代器
Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
相关习题
-
题目描述:反转一个单链表。
代码示例:
public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode nextTemp = curr.next; curr.next = prev; prev = curr; curr = nextTemp; } return prev; }
-
题目描述:给定一个链表,判断链表中是否有环。
代码示例:
public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } ListNode slow = head; ListNode fast = head.next; while (slow != fast) { if (fast == null || fast.next == null) { return false; } slow = slow.next; fast = fast.next.next; } return true; }
-
题目描述:判断一个链表是否为回文链表。
代码示例:
public boolean isPalindrome(ListNode head) { if (head == null || head.next == null) { return true; } ListNode middle = findMiddle(head); ListNode secondHalf = reverseList(middle.next); ListNode p1 = head; ListNode p2 = secondHalf; while (p2 != null) { if (p1.val != p2.val) { return false; } p1 = p1.next; p2 = p2.next; } return true; } private ListNode findMiddle(ListNode head) { ListNode slow = head; ListNode fast = head.next; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } return slow; } private ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode nextTemp = curr.next; curr.next = prev; prev = curr; curr = nextTemp; } return prev; }
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数 实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得 到的结果"cdefgab"。
public String reverseLeftWords(String s, int n) {
LinkedList<String> list = new LinkedList<>();
char arr[] = s.toCharArray();
for (int i = 0; i < arr.length; i++) {
list.add(Character.toString(arr[i]));
}
return reverse(list,n);
}
private String reverse(LinkedList<String> list, int n) {
for (int i = 0; i < n; i++) {
String s1 = list.removeFirst();
list.addLast(s1);
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
}
return sb.toString();
}