链表理论基础
类型:
单链表
双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。可以双向查询。
循环链表:链表首尾相连,可解决约瑟夫问题。
存储方式:链表在内存中不是连续分布。通过指针域的指针链接在内存中各个节点。
链表和数组的区别:链表适合频繁增删、数组适合频繁查找。
构建链表:
public class ListNode {
// 结点的值
int val;
// 下一个结点
ListNode next;
// 节点的构造函数(无参)
public ListNode() {
}
// 节点的构造函数(有一个参数)
public ListNode(int val) {
this.val = val;
}
// 节点的构造函数(有两个参数)
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public ListNode removeElements(ListNode head, int val) {
if(head==null) return null;
ListNode dummy = new ListNode();
dummy.next=head;
ListNode cur = dummy;
while(cur!=null && cur.next!=null){
if(cur.next.val==val){
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return dummy.next;
}
class ListNode{
int val;
ListNode next;
ListNode(){};
ListNode(int val){
this.val = val;
}
}
class MyLinkedList {
int size;
ListNode head;
//初始化
public MyLinkedList() {
size=0;
head = new ListNode(0);
}
public int get(int index) {
if(index<0 || index>=size){
return -1;
}
ListNode currentNode = head;
for(int i=0;i<=index;i++){
currentNode = currentNode.next;
}
return currentNode.val;
}
public void addAtHead(int val) {
addAtIndex(0,val);
}
public void addAtTail(int val) {
addAtIndex(size,val);
}
public void addAtIndex(int index, int val) {
if(index>size) return;
if(index<=0) index=0;
size++;
ListNode pre = head;
for(int i=0;i<index;i++){
pre = pre.next;
}
ListNode node = new ListNode(val);
node.next = pre.next;
pre.next = node;
}
public void deleteAtIndex(int index) {
if(index<0 || index>=size) return;
size--;
ListNode pre = head;
for(int i=0;i<index;i++){
pre = pre.next;
}
pre.next = pre.next.next;
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/
本题总结:
每次写都会忘记,还需要多加练习。
public ListNode reverseList(ListNode head) {
if(head==null) return null;
ListNode cur = head;
ListNode pre = null;
//重点
while(cur!=null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}