移除单链表的倒数第N个节点
2019獨角獸企業重金招聘Python工程師標準>>>
原題
Given a linked list, remove the nth node from the end of list and return its head.
For example,
- 1
- 2
- 3
- 1
- 2
- 3
Note:
Given n will always be valid.
Try to do this in one pass.
題目大意
刪除單鏈表的倒數第N個結點,注意:輸入的N都是合法,在一次遍歷中完成操作。
解題思路
先讓一個指針走找到第N個節點,然后再讓一個指針指向頭結點,然后兩具指針一起走,直到前一個指針直到了末尾,后一個指針就是倒數第N+1個結點,刪除倒數第N個結點就可以了。
代碼實現
鏈表結點類
public class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
算法實現類
public class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode pa = head;ListNode pb = head;// 找到第n個結點for (int i = 0; i < n && pa != null; i++) {pa = pa.next;}if (pa == null) {head = head.next;return head;}// pb與pa相差n-1個結點// 當pa.next為null,pb在倒數第n+1個位置while (pa.next != null) {pa = pa.next;pb = pb.next;}pb.next = pb.next.next;return head;} }?
第一種方式:
1.首先判斷K值和鏈表是否為空,如果k<=0,或鏈表為空,直接返回head;
2.滿足上面條件后,定義ListNode P=head,重頭開始遍歷鏈表,走k步后,退出循環(在此循環中,如果沒到K不p就為null了,說明沒有倒數第K個節點,k大于表長度了,直接返回head)。
3.定義ListNode q = head,與p同步向后走,直到p的next為空時候,節點為要刪除節點的前一個結點。
第二種方式:
1.首先判斷K值和鏈表是否為空,如果k<=0,或鏈表為空,直接返回head;
2.遍歷一遍鏈表,每走一步,讓k值減1.
3.遍歷完后,如果k大于零,說明k大于鏈表長度,直接返回head;如果k等于0,要刪除的節點就是頭結點,直接返回head.next;如果k小于0時候第4步。
4.定義q=head,從新遍歷節點,每走一步k加1,直到k=0時候,退出循環,此時q的下一個節點就是要刪除的節點。
(4.解析:在這部分,為什么這樣做,可能不是很容易理解,給大家舉個例子,假如現在有一鏈表有8個節點,k=3.那么,前三步后,k=-5。大家想一想,k等于三是要刪除倒數第3個節點,我們只要從頭走5步就可以到達刪除節點的前一個節點了,為啥是5,因為8 = 3+5。說道這里不知道你明白沒有。)
Java代碼如下(測試過)
package bjtu.edu.cn1;public class ListNodeTest {// 2.在單鏈表中刪除倒數第k個節點(方法一)public static ListNode removeLastKthNode(ListNode head, int k) {if (k <= 0 || head == null)return head;ListNode p = head;for (int i = 0; i < k; i++) {if (p.nextNode != null)p = p.nextNode;elsereturn head;}ListNode q = head;while (p.nextNode != null) {p = p.nextNode;q = q.nextNode;}q.nextNode = q.nextNode.nextNode;return head;}// 2.在單鏈表中刪除倒數第k個節點(方法二)public static ListNode removeLastKthNode2(ListNodehead, int k) {if(k <= 0 ||head == null)return head;ListNode p = head;while(p!=null){p = p.nextNode;k--;}if(k==0)return head.nextNode;if(k<0){ListNode q = head;while(++k!=0){ //這里注意,先自加,在判斷q=q.nextNode;}q.nextNode=q.nextNode.nextNode;}return head;}// 創建鏈表public static ListNode creatListNode(int data[]) {ListNode head = new ListNode (data[0]);ListNode temp = head;for (int i = 1; i < data.length; i++) {ListNode headNext = new ListNode(data[i]);temp.nextNode = headNext;temp = temp.nextNode;}return head;}// 測試個方法public static void main(String[] args) {int[] data1 = { 1, 2, 4, 5, 6, 7 };ListNode head1 = creatListNode(data1);//在單鏈表中刪除倒數第k個節點ListNode head = removeLastKthNode2(head1, 1);while (head != null) {System.out.println(head.values);head = head.nextNode;}} }// 鏈表節點類 class ListNode {public int values;public ListNode nextNode;public ListNode(int data) {this.values = data;}}轉載于:https://my.oschina.net/u/2822116/blog/804951
總結
以上是生活随笔為你收集整理的移除单链表的倒数第N个节点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [翻译]Triggerless desi
- 下一篇: IIS连接数、IIS并发连接数、IIS最