重点:
- 在涉及到头节点的操作时,创建哑节点。
- 注意链表头结点判空条件。
LeetCode203.移除链表元素
public ListNode removeElements(ListNode head, int val) {
//处理头节点(涉及到头节点删几个的问题)-》用创建哑节点的方法
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode p = dummyHead;
while(p.next!=null) {
//如果值相等,则去除掉该节点
if(p.next.val==val) {
p.next=p.next.next;
}//如果值不等,则正常遍历下一个节点
else {
p=p.next;
}
}
return dummyHead.next;
}
LeetCode707.设计链表
public class MyLinkedList {
//记录头节点
ListNode head;
//创建一个头结点进行初始化
public MyLinkedList() {
head = new ListNode(0);
}
//获取下标为index的结点值
public int get(int index) {
ListNode dummyHead = head;
int i=0;
while(dummyHead!=null) {
if(i==index) {
return dummyHead.val;
}
dummyHead=dummyHead.next;
}
return -1;
}
//插入新的头节点
public void addAtHead(int val) {
ListNode dummyHead = new ListNode(val);
dummyHead.next = head;
head=dummyHead;
}
//追加尾结点
public void addAtTail(int val) {
ListNode dummyHead = head;
while(dummyHead.next!=null) {
dummyHead=dummyHead.next;
}
ListNode p = new ListNode(val);
dummyHead.next=p;
}
//在指定位置追加结点
public void addAtIndex(int index, int val) {
if(index==0) {
addAtHead(val);
}else {
ListNode dummyHead = head;
int i=1;
while(dummyHead!=null) {
if(i==index) {
//添加新结点
ListNode n = new ListNode(val);
n.next=dummyHead.next;
dummyHead.next=n;
return;
}
dummyHead=dummyHead.next;
}
}
}
//删除指定位置的结点
public void deleteAtIndex(int index) {
//删除头结点
if(index==0) {
head=head.next;
}else {
ListNode dummyHead = head;
int i=1;
while(dummyHead!=null) {
if(i==index) {
//删除结点
dummyHead.next=dummyHead.next.next;
return;
}
dummyHead=dummyHead.next;
}
}
}
}
LeetCode206.反转链表
public ListNode reverseList(ListNode head) {
//重点!
if(head==null||head.next==null) {
return head;
}
//处理头节点(涉及到头节点删几个的问题)-》用创建哑节点的方法
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
while(head.next!=null) {
//脱去一个结点加在头节点上
ListNode temp = head.next;
head.next=head.next.next;
temp.next=dummyHead.next;
dummyHead.next=temp;
}
return dummyHead.next;
}