Leetcode. 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) {
while(head!=null && head.val==val){
head = head.next;
}
if(head == null){
return head;
}
ListNode prev = head;
while(prev.next!=null){
if(prev.next.val==val){
prev.next = prev.next.next;
}
else{
prev = prev.next;
}
}
return head;
}
}
方法二(添加一个虚拟头结点)
//方法二(添加一个虚拟头结点)
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyNode = new ListNode(-1, head);
ListNode pre = dummyNode;
while(pre.next!=null){
if(pre.next.val==val){
pre.next = pre.next.next;
}else{
pre = pre.next;
}
}
return dummyNode.next;
}
}
Leetcode. 707
单链表
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 pred = head;
for(int i = 0; i < index; i++){
pred = pred.next;
}
ListNode toAdd = new ListNode(val);
toAdd.next = pred.next;
pred.next = toAdd;
}
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;
return;
}
}
/**
* 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);
*/
双链表
class ListNode{
int val;
ListNode next;
ListNode prev;
ListNode(int val){
this.val = val;
}
}
class MyLinkedList {
int size;
ListNode head, tail;
public MyLinkedList() {
size = 0;
head = new ListNode(0);
tail = new ListNode(0);
head.next = tail;
tail.prev = head;
}
public int get(int index) {
if(index < 0 || index >= size) return -1;
ListNode cur = head;
if(index >= size / 2){
cur = tail;
for(int i = 0; i < size-index; i++){
cur = cur.prev;
}
}else{
for(int i = 0; i <= index; i++){
cur = cur.next;
}
}
return cur.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 toAdd = new ListNode(val);
toAdd.next = pre.next;
toAdd.prev = pre;
pre.next.prev = toAdd;
pre.next = toAdd;
}
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.next.prev = pre;
pre.next = pre.next.next;
return;
}
}
/**
* 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);
*/
Leetcode. 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 cur = head;
ListNode fore;
ListNode back = null;
while(cur!=null){
fore = cur.next;
cur.next = back;
back = cur;
cur = fore;
}
return back;
}
}
递归
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(null, head);
}
ListNode reverse(ListNode prev, ListNode cur){
if(cur == null) return prev;
ListNode temp = cur.next;
cur.next = prev;
return reverse(cur, temp);
}
}