目录
leetcode19题:删除链表的倒数第N个节点
题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
解法1:
删除链表的倒数第n个节点,首先可以先求出链表的长度,然后找到要删除节点的前一个节点,让要删除节点的前一个节点的next指向要删除的下一个节点即可。
代码:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode node=head;
ListNode pre=head;
int count=0;
//首先求链表的长度(包括head节点)
while(node!=null) {
count++;
node = node.next;
}
//如果last=0表明要删除的是头节点
int last=count-n;
if(last==0){
return head.next;
}
//当last不等于0时,找到删除节点的前一个节点,然后删除该节点的后一个节点
for(int i=0;i<last-1;i++){
pre=pre.next;
}
pre.next=pre.next.next;
return head;
}
解法2:双指针法:先用一个指针指向head节点,然后让这个指针往后走n步,如果此时该节点为空,删除头节点;然后另一个指针指向头节点,两个指针同时向后走,知道第一个指针走到最后一个节点,另一个指针指向的是倒数第N个节点,找到要删除节点的前一个节点,进行删除。
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast=head;
ListNode last=head;
for(int i=0;i<n;i++){
fast=fast.next;
}
if(fast==null){
return head.next;
}
while(fast.next!=null){
//找到要删除节点的前一个节点last
fast=fast.next;
last=last.next;
}
last.next=last.next.next;
return head;
}
leetcode 206反转链表
描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
输入:head = [] 输出:[]
方法1:使用一个空的头节点,每次取下一个节点放在头节点之后,返回头节点之后的链表。(头插法)
public ListNode reverseList(ListNode head) {
//反转链表,使用一个头节点,每次取下一个节点放在头节点之后。
ListNode node=new ListNode();
node.next=null;
ListNode temp=head;//作为每次取下的节点
ListNode temp2;
while(temp!=null){
temp2=temp;
temp=temp.next;//指向下一个节点
temp2.next=node.next;//插到头节点之后
node.next=temp2;
}
return node.next;
//---------------不用新建一个头节点,只要将每次取下的节点作为头节点即可----------
ListNode node=head.next;//从头节点的下一个节点开始
head.next=null;
ListNode temp;
while(node!=null){
temp=node;
node=node.next;
temp.next=head;
head=temp;
}
return head;
}
解法2:栈特点是先进后出,使用栈将链表中所有元素入栈,然后再将所有元素出战赋值。
Stack<Integer> stack=new Stack<Integer>();
ListNode node=head;
while(node!=null){
stack.push(node.val);
node=node.next;
}
node=head;
while(!stack.isEmpty()){
node.val=stack.pop();
node=node.next;
}
return head;