203.移除链表元素
题目:
采用递归的方法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
if (head==null)
return head;
head.next=removeElements(head.next,val);
return head.val==val?head.next:head;
}
}
707.设计链表
题目:
class MyLinkedList {
int size;//存储链表元素的个数
ListNode head;//虚拟头节点
public MyLinkedList() {
size=0;
head=new ListNode(0);
}
public int get(int index) {
//如果index非法,返回-1
if (index<0||index>=size)
return -1;
ListNode currentNode =head;
//包含一个虚拟头节点,所以查找第index+1个节点。
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);
}
// 在下标为 index 的节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
// 如果 index 等于链表的长度,则说明是新插入的节点为链表的尾结点
// 如果 index 大于链表的长度,则返回空
public void addAtIndex(int index, int val) {
if (index>size)
return;
if (index<0)
index=0;
size++;
ListNode pred=head;
//有虚拟头节点,所以
for (int i=0;i<index;i++){
pred=pred.next;
}
ListNode toAdd = new ListNode(val);
toAdd.next=pred.next;
pred.next=toAdd;
}
//删除下标为index的节点
public void deleteAtIndex(int index) {
if (index<0||index>=size)
return;
size--;
if (index==0){
head=head.next;
return;
}
ListNode pred=head;
for (int i=0;i<index;i++){
pred=pred.next;
}
pred.next=pred.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);
*/
206.反转链表
题目:
双指针法:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode current =head;
ListNode pre=null;
while (current!=null){
ListNode temp=current.next;
current.next=pre;
pre=current;
current=temp;
}
return pre;
}
}
递归:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverse(ListNode current,ListNode pre){
if (current==null) return pre;
ListNode temp =current.next;
current.next=pre;
return reverse(temp,current);
}
//主函数
public ListNode reverseList(ListNode head){
return reverse(head,null);
}
}